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,
|
(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,
|
(4) |
(since C++11)
(constexpr since C++14) |
Returns the lowest and the greatest of the given 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 the first argument is
less
than the second.
The signature of the comparison function should be equivalent to the following: bool cmp ( const Type1 & a, const Type2 & b ) ;
While the signature does not need to have
const
&
, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const)
|
Return value
Complexity
3N |
2 |
3N |
2 |
Possible implementation
minmax (1) |
---|
minmax (2) |
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); } |
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
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
See also
returns the smaller of the given values
(function template) |
|
returns the greater of the given values
(function template) |
|
(C++11)
|
returns the smallest and the largest elements in a range
(function template) |
(C++20)
|
returns the smaller and larger of two elements
(algorithm function object) |