Namespaces
Variants

std::max

С ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например, ranges::copy, ranges::sort, ...
Немодифицирующие операции над последовательностями    
Пакетные операции
(C++17)
Операции поиска
Модифицирующие операции над последовательностями
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разбиения
(C++11)    

Операции сортировки
Операции бинарного поиска
(по разбитым диапазонам)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения (C++17)
(только для описания*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









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

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

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

Сложность

1) Ровно одно сравнение с использованием operator<.
2) Ровно одно применение функции сравнения comp.
3,4) Пусть N равно ilist.size():
3) Ровно N-1 сравнений с использованием operator<.
4) Ровно 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 требовался быть CopyConstructible для перегрузок (1,2) не требовался
LWG 2239 C++98
C++11
1. T требовался быть LessThanComparable для
    перегрузок (2) (C++98) и (4) (C++11)
2. требования к сложности отсутствовали
1. не требуется
2. добавлены требования

Смотри также

возвращает меньшее из заданных значений
(шаблон функции & объект функции алгоритма)
(C++11)
возвращает меньшее и большее из двух элементов
(шаблон функции & объект функции алгоритма)
возвращает наибольший элемент в диапазоне
(шаблон функции & объект функции алгоритма)
(C++17)
зажимает значение между парой граничных значений
(шаблон функции & объект функции алгоритма)
возвращает большее из заданных значений
(объект функции алгоритма)