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.
1) Для сравнения значений используется operator<.
Если T не является сравнимым на меньше, поведение не определено.
2) Для сравнения значений используется функция сравнения comp.
3,4) Возвращает наибольшее из значений в списке инициализации ilist.
Если ilist.size() равно нулю или T не является копируемо-конструируемым, поведение не определено.
3) Для сравнения значений используется operator<.
Если T не является сравнимым на меньше, поведение не определено.
4) Для сравнения значений используется функция сравнения comp.

Параметры

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

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

boolcmp(constType1&a,constType2&b);

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

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

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

Сложность

1) Ровно одно сравнение с использованием operator<.
2) Ровно один вызов функции сравнения comp.
3,4) Пусть \(\scriptsize N\)N — ilist.size():
3) Ровно \(\scriptsize N-1\)N-1 сравнений с использованием operator<.
4) Ровно \(\scriptsize N-1\)N-1 вызовов функции сравнения comp.

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

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 должен был быть копируемо-конструируемым для перегрузок (1,2) не требуется
LWG 2239 C++98
C++11
1. T должен был быть сравнимым на меньше для
перегрузок (2) (C++98) и (4) (C++11)
2. отсутствовали требования к сложности
1. не требуется
2. требования добавлены

См. также

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

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

Spec-Zone.ru

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