Espacios de nombres
Variantes
Acciones

std::max

De cppreference.com
< cpp‎ | algorithm
 
 
Biblioteca de algoritmos
Políticas de ejecución (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de partición
Operaciones de ordenación
(C++11)
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mínimo/máximo
(C++11)
(C++17)
Permutaciones
Operaciones numéricas
Bibliotecas C
 
Definido en el archivo de encabezado <algorithm>
template< class T >
const T& max( const T& a, const T& b );
(1) (constexpr desde C++14)
template< class T, class Compare >
const T& max( const T& a, const T& b, Compare comp );
(2) (constexpr desde C++14)
template< class T >
T max( std::initializer_list<T> ilist );
(3) (desde C++11)
(constexpr desde C++14)
template< class T, class Compare >
T max( std::initializer_list<T> ilist, Compare comp );
(4) (desde C++11)
(constexpr desde C++14)

Devuelve el mayor de los valores dados.

1,2) Devuelve el mayor de a y b.
1) Usa operator< para comparar los valores.
Si T no es LessThanComparable, el comportamiento no está definido.
2) Usa la función de comparación comp para comparar los valores.
3,4) Devuelve el mayor de los valores en la lista de inicializadores ilist.
Si ilist.size() es cero, o T no es CopyConstructible, el comportamiento no está definido.
3) Usa operator< para comparar los valores.
Si T no es LessThanComparable, el comportamiento no está definido.
4) Usa la función de comparación comp para comparar los valores.

Contenido

[editar] Parámetros

a, b - Los valores a comparar.
ilist - La lista de inicializadores con los valores a comparar.
comp - objeto función de comparación (es decir, un objeto que satisface los requerimientos de Compare) que devuelve ​true si a es menor que b .

La signatura de la función de comparación deberá ser equivalente a lo siguiente:

 bool cmp(const Type1 &a, const Type2 &b);

Mientras que la signatura no necesita ser const &, la función no debe modificar los objetos que se le pasaron y debe admitir todos los valores de los tipos (posiblemente const) Type1 y Type2 a pesar de la categoría de valor (por consiguiente, no se permite a Type1 & , ni tampoco a Type1 a menos que para Type1 un movimiento sea equivalente a una copia (desde C++11)).
Los tipos Type1 y Type2 deben ser tales que un objeto de tipo T puede convertirse implícitamente a ambos. ​

[editar] Valor de retorno

1,2) El mayor de a y b. Si son equivalentes, devuelve a.
3,4) El valor mayor en la lista ilist. Si varios valores son equivalentes al mayor, devuelve el más a la izquierda.

[editar] Complejidad

1) Exactamente una comparación usando operator<.
2) Exactamente una aplicación de la función de comparación comp.
3,4) Dada N como ilist.size():
3) Exactamente N-1 comparaciones usando operator<.
4) Exactamente N-1 aplicaciones de la función de comparación comp.

[editar] Posible implementación

max (1)
template<class T> 
const T& max(const T& a, const T& b)
{
    return (a < b) ? b : a;
}
max (2)
template<class T, class Compare> 
const T& max(const T& a, const T& b, Compare comp)
{
    return (comp(a, b)) ? b : a;
}
max (3)
template<class T>
T max(std::initializer_list<T> ilist)
{
    return *std::max_element(ilist.begin(), ilist.end());
}
max (4)
template<class T, class Compare>
T max(std::initializer_list<T> ilist, Compare comp)
{
    return *std::max_element(ilist.begin(), ilist.end(), comp);
}

[editar] Notas

Capturar el resultado de std::max por referencia produce una referencia pendiente si uno de los parámetros es un temporal y ese parámetro se devuelve:

int n = 1;
const int& r = std::max(n-1, n+1);
// r es pendiente

[editar] Ejemplo

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string_view>
 
int main()
{
    auto longest = [](const std::string_view s1, const std::string_view s2)
                   {
                       return s1.size() < s2.size();
                   };
 
    std::cout << "El mayor de 69 y 96 es " << std::max(69, 96) << "\n"
                 "El mayor de 'q' y 'p' es '" << std::max('q', 'p') << "'\n"
                 "El mayor de 010, 10, 0X10, y 0B10 es "
              << std::max({010, 10, 0X10, 0B10}) << '\n'
              << R"(El más largo de "long", "short", e "int" es )"
              << std::quoted(std::max({"long", "short", "int"}, longest)) << '\n';
}

Salida:

El mayor de 69 y 96 es 96
El mayor de 'q' y 'p' es 'q'
El mayor de 010, 10, 0X10, y 0B10 es 16
El más largo de "long", "short", e "int" es "short"

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 281 C++98 Se requería que T fuera CopyConstructible para las sobrecargas (1,2). No se requiere.
LWG 2239 C++98
C++11
1. Se requería que T fuera LessThanComparable para
    las sobrecargas (2) (C++98) y (4) (C++11)
2. Faltaba la complejidad de los requisitos.
1. No se requiere.
2. Se añadieron los requisitos.

[editar] Véase también

Devuelve el menor de los elementos
(plantilla de función) [editar]
(C++11)
Devuelve el menor y el mayor de dos elementos.
(plantilla de función) [editar]
Devuelve el elemento más grande en un rango.
(plantilla de función) [editar]
(C++17)
Restringe un valor entre un par de valores limitantes
(plantilla de función) [editar]
Devuelve el mayor de los valores dados
(niebloid) [editar]