std::minmax
| Definido en el encabezado <algorithm>
|
||
template< class T >
std::pair<const T&, const T&> minmax( const T& a, const T& b );
|
(1) | (desde C++11) (constexpr desde C++14) |
template< class T, class Compare >
std::pair<const T&, const T&> minmax( const T& a, const T& b,
Compare comp );
|
(2) | (desde C++11) (constexpr desde C++14) |
template< class T >
std::pair<T, T> minmax( std::initializer_list<T> ilist );
|
(3) | (desde C++11) (constexpr desde C++14) |
template< class T, class Compare >
std::pair<T, T> minmax( std::initializer_list<T> ilist,
Compare comp );
|
(4) | (desde C++11) (constexpr desde C++14) |
Devuelve el menor y el mayor de los valores dados.
a y b.operator< para comparar los valores.T no es LessThanComparable, el comportamiento es indefinido.comp para comparar los valores.ilist.operator< para comparar los valores.T no es LessThanComparable, el comportamiento es indefinido.comp para comparar los valores.Parámetros
| a, b | - | los valores a comparar |
| ilist | - | lista de inicialización con los valores a comparar |
| comp | - | objeto función de comparación (es decir, un objeto que satisface los requisitos de Compare) que devuelve true si el primer argumento es menor que el segundo.La firma de la función de comparación debe ser equivalente a lo siguiente:
Aunque la firma no necesita tener |
Valor de retorno
std::pair<const T&, const T&>(a, b) si a < b o si a es equivalente a b. Devuelve el resultado de std::pair<const T&, const T&>(b, a) si b < a.ilist como primer elemento y el más grande como segundo. Si varios elementos son equivalentes al más pequeño, se devuelve el elemento más a la izquierda. Si varios elementos son equivalentes al más grande, se devuelve el elemento más a la derecha.Complejidad
operator<.comp.ilist.size():| 3N |
| 2 |
operator<.| 3N |
| 2 |
comp.Posible implementación
| 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);
}
|
Notas
Para las sobrecargas (1,2), si uno de los parámetros es un temporal, la referencia devuelta se convierte en una referencia colgante al final de la expresión completa que contiene la llamada a 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
Ejemplo
#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';
}
Posible salida:
v[2,7]: 4 1 5 9 2
Informes de defectos
Los siguientes informes de defectos que cambian el comportamiento se aplicaron retroactivamente a los estándares C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento como se publicó | Comportamiento correcto |
|---|---|---|---|
| LWG 2239 | C++11 | T se requería que fuera LessThanComparable para las sobrecargas (2,4)
|
no requerido |
Véase también
| devuelve el menor de los valores dados (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| devuelve el mayor de los valores dados (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++11) |
devuelve el elemento más pequeño y el más grande en un rango (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
(C++20) |
devuelve el menor y el mayor de dos elementos (objeto función de algoritmo) |