std:: minmax_element
|
Definido en el encabezado
<algorithm>
|
||
|
template
<
class
ForwardIt
>
std::
pair
<
ForwardIt, ForwardIt
>
|
(1) |
(desde C++11)
(constexpr desde C++17) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt
>
std::
pair
<
ForwardIt, ForwardIt
>
|
(2) | (desde C++17) |
|
template
<
class
ForwardIt,
class
Compare
>
std::
pair
<
ForwardIt, ForwardIt
>
|
(3) |
(desde C++11)
(constexpr desde C++17) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
Compare
>
std::
pair
<
ForwardIt, ForwardIt
>
|
(4) | (desde C++17) |
Encuentra el elemento más pequeño y más grande en el rango
[
first
,
last
)
.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true . |
(hasta C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true . |
(desde C++20) |
Contenidos |
Parámetros
| first, last | - | el par de iteradores que definen el rango de elementos a examinar |
| policy | - | la política de ejecución a utilizar |
| cmp | - |
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 la siguiente: bool cmp ( const Type1 & a, const Type2 & b ) ;
Aunque la firma no necesita tener
const
&
, la función no debe modificar los objetos pasados a ella y debe poder aceptar todos los valores de tipo (posiblemente const)
|
| Requisitos de tipo | ||
-
ForwardIt
debe cumplir con los requisitos de
LegacyForwardIterator
.
|
||
Valor de retorno
un par que consiste en un iterador al elemento más pequeño como primer elemento y un iterador al elemento más grande como segundo. Retorna std:: make_pair ( first, first ) si el rango está vacío. Si varios elementos son equivalentes al elemento más pequeño, se retorna el iterador al primer elemento de este tipo. Si varios elementos son equivalentes al elemento más grande, se retorna el iterador al último elemento de este tipo.
Complejidad
Dado N como std:: distance ( first, last ) :
| 3 |
| 2 |
| 3 |
| 2 |
Excepciones
Las sobrecargas con un parámetro de plantilla llamado
ExecutionPolicy
reportan errores de la siguiente manera:
-
Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y
ExecutionPolicyes uno de los standard policies , std::terminate es llamado. Para cualquier otroExecutionPolicy, el comportamiento está definido por la implementación. - Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.
Implementación posible
| minmax_element |
|---|
template<class ForwardIt> std::pair<ForwardIt, ForwardIt> minmax_element(ForwardIt first, ForwardIt last) { using value_type = typename std::iterator_traits<ForwardIt>::value_type; return std::minmax_element(first, last, std::less<value_type>()); } |
| minmax_element |
template<class ForwardIt, class Compare> std::pair<ForwardIt, ForwardIt> minmax_element(ForwardIt first, ForwardIt last, Compare comp) { auto min = first, max = first; if (first == last || ++first == last) return {min, max}; if (comp(*first, *min)) min = first; else max = first; while (++first != last) { auto i = first; if (++first == last) { if (comp(*i, *min)) min = i; else if (!(comp(*i, *max))) max = i; break; } else { if (comp(*first, *i)) { if (comp(*first, *min)) min = first; if (!(comp(*i, *max))) max = i; } else { if (comp(*i, *min)) min = i; if (!(comp(*first, *max))) max = first; } } } return {min, max}; } |
Notas
Este algoritmo es diferente de std:: make_pair ( std:: min_element ( ) , std:: max_element ( ) ) , no solo en eficiencia, sino también en que este algoritmo encuentra el último elemento más grande mientras que std::max_element encuentra el primer elemento más grande.
Ejemplo
#include <algorithm> #include <iostream> int main() { const auto v = {3, 9, 1, 4, 2, 5, 9}; const auto [min, max] = std::minmax_element(begin(v), end(v)); std::cout << "min = " << *min << ", max = " << *max << '\n'; }
Salida:
min = 1, max = 9
Véase también
|
devuelve el elemento más pequeño en un rango
(plantilla de función) |
|
|
devuelve el elemento más grande en un rango
(plantilla de función) |
|
|
(C++20)
|
devuelve los elementos más pequeño y más grande en un rango
(objeto función de algoritmo) |