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.operator< для сравнения значений.T не является LessThanComparable, поведение не определено.comp для сравнения значений.ilist.operator< для сравнения значений.T не является LessThanComparable, поведение не определено.comp для сравнения значений.Параметры
| a, b | - | сравниваемые значения |
| ilist | - | список инициализации со значениями для сравнения |
| comp | - | объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает true, если a меньше b.Сигнатура функции сравнения должна быть эквивалентна следующей:
Хотя сигнатура не обязательно должна содержать |
Возвращаемое значение
a и b. Если они эквивалентны, возвращает a.ilist. Если несколько значений эквивалентны наибольшему, возвращается самое левое.Сложность
operator<.comp.ilist.size():operator<.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++20) |
|
(C++11) |
возвращает меньшее и большее из двух элементов (шаблон функции & объект функции алгоритма) |
(C++20) |
|
| возвращает наибольший элемент в диапазоне (шаблон функции & объект функции алгоритма) | |
(C++20) |
|
(C++17) |
зажимает значение между парой граничных значений (шаблон функции & объект функции алгоритма) |
(C++20) |
|
(C++20) |
возвращает большее из заданных значений (объект функции алгоритма) |