Spec-Zone.ru › C++

std::max

Определено в заголовке <algorithm>
template< class T >
const T& max( const T& a, const T& b );
(1) (constexpr начиная с C++14)
template< class T, class Compare >
const T& max( const T& a, const T& b, Compare comp );
(2) (constexpr начиная с C++14)
template< class T >
T max( std::initializer_list<T> ilist );
(3) (начиная с C++11)
(constexpr начиная с C++14)
template< class T, class Compare >
T max( std::initializer_list<T> ilist, Compare comp );
(4) (начиная с C++11)
(constexpr начиная с C++14)

Возвращает большее из заданных значений.

1,2) Возвращает большее из a и b.
3,4) Возвращает наибольшее из значений в списке инициализации ilist.

Перегрузки (1,3) используют operator< для сравнения значений, перегрузки (2,4) используют заданную функцию сравнения comp.

Параметры

a, b - сравниваемые значения
ilist - список инициализации со значениями для сравнения
comp - объект функции сравнения (например, объект, удовлетворяющий требованиям Compare), который возвращает true если a меньше, чем b.

Подпись функции сравнения должна быть эквивалентна следующей:

bool cmp(const Type1& a, const Type2& b);

Хотя подпись не обязательно должна содержать const&, функция не должна изменять объекты, передаваемые ей, и должна уметь принимать все значения типа (возможно, const) Type1 и Type2 независимо от категории значения (поэтому Type1& недопустимо, так же как и Type1 за исключением случаев, когда для Type1 перемещение эквивалентно копированию(начиная с C++11)).
Типы Type1 и Type2 должны быть такими, чтобы объект типа T можно было неявно преобразовать в оба из них.

Требования к типу
-T должен соответствовать требованиям LessThanComparable для использования перегрузок (1,3).
-T должен соответствовать требованиям CopyConstructible для использования перегрузок (3,4).

Возвращаемое значение

1,2) Большее из a и b. Если они эквивалентны, возвращает a.
3,4) Наибольшее значение в ilist. Если несколько значений эквивалентны наибольшему, возвращает самое левое.

Сложность

1,2) Ровно одно сравнение.
3,4) Ровно ilist.size() - 1 сравнений.

Возможная реализация

max (1)
template<class T> 
const T& max(const T& a, const T& b)
{
    return (a < b) ? b : a;
}
max (2)
template<class T, class Compare> 
const T& max(const T& a, const T& b, Compare comp)
{
    return (comp(a, b)) ? b : a;
}
max (3)
template<class T>
T max(std::initializer_list<T> ilist)
{
    return *std::max_element(ilist.begin(), ilist.end());
}
max (4)
template<class T, class Compare>
T max(std::initializer_list<T> ilist, Compare comp)
{
    return *std::max_element(ilist.begin(), ilist.end(), comp);
}

Примечания

Захват результата std::max по ссылке создает висячую ссылку, если один из параметров является временным, и этот параметр возвращается:

int n = -1;
const int& r = std::max(n + 2, n * 2); // r is dangling

Пример

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string_view>
 
int main()
{
    auto longest = [](const std::string_view s1, const std::string_view s2)
                   {
                       return s1.size() < s2.size();
                   };
 
    std::cout << "Larger of 69 and 96 is " << std::max(69, 96) << "\n"
                 "Larger of 'q' and 'p' is '" << std::max('q', 'p') << "'\n"
                 "Largest of 010, 10, 0X10, and 0B10 is "
              << std::max({010, 10, 0X10, 0B10}) << '\n'
              << R"(Longest of "long", "short", and "int" is )"
              << std::quoted(std::max({"long", "short", "int"}, longest)) << '\n';
}

Вывод:

Larger of 69 and 96 is 96
Larger of 'q' and 'p' is 'q'
Largest of 010, 10, 0X10, and 0B10 is 16
Longest of "long", "short", and "int" is "short"

Отчеты об ошибках

Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение, как опубликовано Правильное поведение
LWG 281 C++98 T должно было быть CopyConstructible для перегрузок (1,2) не требуется

См. также

min
возвращает меньшее из заданных значений
(шаблон функции)
minmax
(C++11)
возвращает меньшее и большее из двух элементов
(шаблон функции)
max_element
возвращает наибольший элемент в диапазоне
(шаблон функции)
clamp
(C++17)
ограничение значения между двумя граничными значениями
(шаблон функции)
ranges::max
(C++20)
возвращает большее из заданных значений
(niebloid)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/max

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API