std::minmax
| Defined in header <algorithm>
|
||
template< class T >
std::pair<const T&, const T&> minmax( const T& a, const T& b );
|
(1) | (since C++11) (constexpr since C++14) |
template< class T, class Compare >
std::pair<const T&, const T&> minmax( const T& a, const T& b,
Compare comp );
|
(2) | (since C++11) (constexpr since C++14) |
template< class T >
std::pair<T, T> minmax( std::initializer_list<T> ilist );
|
(3) | (since C++11) (constexpr since C++14) |
template< class T, class Compare >
std::pair<T, T> minmax( std::initializer_list<T> ilist,
Compare comp );
|
(4) | (since C++11) (constexpr since C++14) |
Returns the smallest and the greatest of the given values.
a and b in order.operator< to compare the values.T is not LessThanComparable, the behavior is undefined.comp to compare the values.ilist.operator< to compare the values.T is not LessThanComparable, the behavior is undefined.comp to compare the values.Parameters
| a, b | - | the values to compare |
| ilist | - | initializer list with the values to compare |
| comp | - | comparison function object (i.e. an object that satisfies the requirements of Compare) which returns true if a is less than b.The signature of the comparison function should be equivalent to the following:
While the signature does not need to have |
Return value
- The data member
firstholdsbisbis smaller thana, oraotherwise. - The data member
secondholdsaisbis smaller thana, orbotherwise.
- The data member
firstholds the smallest value inilist. If there are multiple smallest values,firstholds the first one of them. - The data member
secondholds the largest value inilist. If there are multiple largest values,secondholds the last one of them.
Complexity
operator<.comp.ilist.size():| 3N |
| 2 |
operator<.| 3N |
| 2 |
comp.Notes
For overloads (1,2), if one of the parameters is a temporary, the reference returned becomes a dangling reference at the end of the full expression that contains the call to 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
Possible implementation
| 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);
}
|
Example
#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';
}
Possible output:
v[2,7]: 4 1 5 9 2
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2239 | C++11 | T was required to be LessThanComparable for overloads (2,4)
|
not required |
See also
(C++20) |
returns the smaller and larger of two elements (algorithm function object) |
| returns the smaller of the given values (function template & algorithm function object) | |
(C++20) |
|
| returns the greater of the given values (function template & algorithm function object) | |
(C++20) |
|
(C++11) |
returns the smallest and the largest elements in a range (function template & algorithm function object) |
(C++20) |