std::minmax
| Определён в заголовке <algorithm>
|
||
template< class T >
std::pair<const T&, const T&> minmax( const T& a, const T& b );
|
(1) | (начиная с C++11) (constexpr начиная с C++14) |
template< class T, class Compare >
std::pair<const T&, const T&> minmax( const T& a, const T& b,
Compare comp );
|
(2) | (начиная с C++11) (constexpr начиная с C++14) |
template< class T >
std::pair<T, T> minmax( std::initializer_list<T> ilist );
|
(3) | (начиная с C++11) (constexpr начиная с C++14) |
template< class T, class Compare >
std::pair<T, T> minmax( 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, если первый аргумент меньше второго.Сигнатура функции сравнения должна быть эквивалентна следующей:
Хотя сигнатуре не обязательно иметь |
Возвращаемое значение
std::pair<const T&, const T&>(a, b), если a < b или если a эквивалентно b. Возвращает результат std::pair<const T&, const T&>(b, a), если b < a.ilist в качестве первого элемента и наибольшим в качестве второго. Если несколько элементов эквивалентны наименьшему, возвращается самый левый такой элемент. Если несколько элементов эквивалентны наибольшему, возвращается самый правый такой элемент.Сложность
operator<.comp.ilist.size():| 3N |
| 2 |
operator<.| 3N |
| 2 |
comp.Возможная реализация
| minmax (1) |
|---|
template<class T>
constexpr std::pair<const T&, const T&> minmax(const T& a, const T& b)
{
return (b < a) ? std::pair<const T&, const T&>(b, a)
: std::pair<const T&, const T&>(a, b);
}
|
| minmax (2) |
template<class T, class Compare>
constexpr std::pair<const T&, const T&> minmax(const T& a, const T& b, Compare comp)
{
return comp(b, a) ? std::pair<const T&, const T&>(b, a)
: std::pair<const T&, const T&>(a, b);
}
|
| minmax (3) |
template<class T>
constexpr std::pair<T, T> minmax(std::initializer_list<T> ilist)
{
auto p = std::minmax_element(ilist.begin(), ilist.end());
return std::pair(*p.first, *p.second);
}
|
| minmax (4) |
template<class T, class Compare>
constexpr std::pair<T, T> minmax(std::initializer_list<T> ilist, Compare comp)
{
auto p = std::minmax_element(ilist.begin(), ilist.end(), comp);
return std::pair(*p.first, *p.second);
}
|
Примечания
Для перегрузок (1,2), если один из параметров является временным объектом, возвращаемая ссылка становится висячей в конце полного выражения, содержащего вызов minmax:
int n = 1;
auto p = std::minmax(n, n + 1);
int m = p.first; // ok
int x = p.second; // undefined behavior
// Note that structured bindings have the same issue
auto [mm, xx] = std::minmax(n, n + 1);
xx; // undefined behavior
Пример
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v{3, 1, 4, 1, 5, 9, 2, 6};
std::srand(std::time(0));
std::pair<int, int> bounds = std::minmax(std::rand() % v.size(),
std::rand() % v.size());
std::cout << "v[" << bounds.first << "," << bounds.second << "]: ";
for (int i = bounds.first; i < bounds.second; ++i)
std::cout << v[i] << ' ';
std::cout << '\n';
}
Возможный вывод:
v[2,7]: 4 1 5 9 2
Отчёты о дефектах
Следующие отчёты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применён к | Поведение в опубликованном виде | Корректное поведение |
|---|---|---|---|
| LWG 2239 | C++11 | T требовался LessThanComparable для перегрузок (2,4)
|
не требуется |
См. также
| возвращает меньшее из заданных значений (шаблон функции & объект функции алгоритма) | |
(C++20) |
|
| возвращает большее из заданных значений (шаблон функции & объект функции алгоритма) | |
(C++20) |
|
(C++11) |
возвращает наименьший и наибольший элементы в диапазоне (шаблон функции & объект функции алгоритма) |
(C++20) |
|
(C++20) |
возвращает меньшее и большее из двух элементов (объект функции алгоритма) |