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) |
Возвращает большее из заданных значений.
a и b.T не является сравнимым на меньше, поведение не определено.comp.ilist.T не является сравнимым на меньше, поведение не определено.comp.Параметры
| a, b | - | значения для сравнения |
| ilist | - | список инициализации со значениями для сравнения |
| comp | - | объект-функция сравнения (то есть объект, удовлетворяющий требованиям Compare), который возвращает true, если a меньше b.Сигнатура функции сравнения должна быть эквивалентна следующей: boolcmp(constType1&a,constType2&b); Хотя сигнатура не обязана содержать |
Возвращаемое значение
a и b. Если они эквивалентны, возвращает a.ilist. Если несколько значений эквивалентны наибольшему, возвращается самое левое из них.Сложность
comp.ilist.size():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. требования добавлены |
См. также
| возвращает меньшее из заданных значений (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | возвращает меньшее и большее из двух элементов (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
| возвращает наибольший элемент в диапазоне (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++17) | ограничивает значение парой граничных значений (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
|
(C++20) | возвращает большее из заданных значений (функциональный объект алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/max