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