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