Namespaces
Variants

std::ranges::max

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Operaciones de ordenamiento y relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montón
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Algoritmos restringidos
Todos los nombres en este menú pertenecen al espacio de nombresstd::ranges
Operaciones de secuencia no modificadoras
Operaciones de secuencia modificadoras
Operaciones de particionado
Operaciones de ordenamiento
Operaciones de búsqueda binaria (en rangos ordenados)
       
       
Operaciones de conjunto (en rangos ordenados)
Operaciones de montón
Operaciones de mínimo/máximo
       
       
Operaciones de permutación
Operaciones de plegado
Operaciones sobre almacenamiento no inicializado
Tipos de retorno
 
Definido en el encabezado<algorithm>
Firma de llamada
template< class T, class Proj = std::identity,
          std::indirect_strict_weak_order<
              std::projected<const T*, Proj>> Comp = ranges::less >
constexpr const T&
    max( const T& a, const T& b, Comp comp = {}, Proj proj = {} );
(1) (desde C++20)
template< std::copyable T, class Proj = std::identity,
          std::indirect_strict_weak_order<
              std::projected<const T*, Proj>> Comp = ranges::less >
constexpr T
    max( std::initializer_list<T> r, Comp comp = {}, Proj proj = {} );
(2) (desde C++20)
template< ranges::input_range R, class Proj = std::identity,
          std::indirect_strict_weak_order<
              std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less >
requires std::indirectly_copyable_storable<ranges::iterator_t<R>,
                                           ranges::range_value_t<R>*>
constexpr ranges::range_value_t<R>
    max( R&& r, Comp comp = {}, Proj proj = {} );
(3) (desde C++20)

Devuelve el mayor de los valores proyectados dados.

1) Devuelve el mayor dea yb.
2) Devuelve el primer valor más grande en la lista de inicializadoresr.
3) Devuelve el primer valor más grande en el rangor.

Las entidades similares a funciones descritas en esta página sonobjetos función de algoritmo (informalmente conocidos comoniebloids), es decir:

Parámetros

a, b - los valores a comparar
r - el rango de valores a comparar
comp - comparación a aplicar a los elementos proyectados
proj - proyección a aplicar a los elementos

Valor de retorno

1) El mayor de a y b , según sus respectivos valores proyectados. Si son equivalentes, devuelve a .
2,3) El valor máximo en r , según la proyección. Si varios valores son equivalentes al máximo, retorna el más a la izquierda. Si el rango está vacío (según lo determinado por ranges:: distance ( r ) ), el comportamiento es indefinido.

Complejidad

1) Exactamente una comparación.
2,3) Exactamente ranges:: distance ( r ) - 1 comparaciones.

Implementación posible

struct max_fn
{
    template<class T, class Proj = std::identity,
             std::indirect_strict_weak_order<
                 std::projected<const T*, Proj>> Comp = ranges::less>
    constexpr
    const T& operator()(const T& a, const T& b, Comp comp = {}, Proj proj = {}) const
    {
        return std::invoke(comp, std::invoke(proj, a), std::invoke(proj, b)) ? b : a;
    }
    template<std::copyable T, class Proj = std::identity,
             std::indirect_strict_weak_order<
                 std::projected<const T*, Proj>> Comp = ranges::less>
    constexpr
    T operator()(std::initializer_list<T> r, Comp comp = {}, Proj proj = {}) const
    {
        return *ranges::max_element(r, std::ref(comp), std::ref(proj));
    }
    template<ranges::input_range R, class Proj = std::identity,
             std::indirect_strict_weak_order<
                  std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less>
    requires std::indirectly_copyable_storable<ranges::iterator_t<R>,
                                               ranges::range_value_t<R>*>
    constexpr
    ranges::range_value_t<R> operator()(R&& r, Comp comp = {}, Proj proj = {}) const
    {
        using V = ranges::range_value_t<R>;
        if constexpr (ranges::forward_range<R>)
            return
                static_cast<V>(*ranges::max_element(r, std::ref(comp), std::ref(proj)));
        else
        {
            auto i = ranges::begin(r);
            auto s = ranges::end(r);
            V m(*i);
            while (++i != s)
                if (std::invoke(comp, std::invoke(proj, m), std::invoke(proj, *i)))
                    m = *i;
            return m;
        }
    }
};
inline constexpr max_fn max;

Notas

Capturar el resultado de std::ranges::max por referencia produce una referencia colgante si uno de los parámetros es temporal y ese parámetro es devuelto:

int n = -1;
const int& r = std::ranges::max(n + 2, n * 2); // r está colgando

Ejemplo

#include <algorithm>
#include <iostream>
#include <string>
static_assert(std::ranges::max({0B10, 0X10, 010, 10}) == 16); // overload (2)
int main()
{
    namespace ranges = std::ranges;
    using namespace std::string_view_literals;
    std::cout << "larger of 1 and 9999: " << ranges::max(1, 9999) << '\n'
              << "larger of 'a', and 'b': '" << ranges::max('a', 'b') << "'\n"
              << "longest of \"foo\", \"bar\", and \"hello\": \""
              << ranges::max({"foo"sv, "bar"sv, "hello"sv}, {},
                             &std::string_view::size) << "\"\n";
}

Salida:

larger of 1 and 9999: 9999
larger of 'a', and 'b': 'b'
longest of "foo", "bar", and "hello": "hello"

Véase también

devuelve el menor de los valores dados
(objeto función de algoritmo)
devuelve el menor y el mayor de dos elementos
(objeto función de algoritmo)
devuelve el elemento más grande en un rango
(objeto función de algoritmo)
limita un valor entre un par de valores límite
(objeto función de algoritmo)
devuelve el mayor de los valores dados
(plantilla de función)