Namespaces
Variants

std::ranges::min

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. 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)

Ordenamiento y operaciones relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de mezcla (en rangos ordenados)
Operaciones de montículo
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 nombres std::ranges
Operaciones de secuencia no modificadoras
Operaciones de secuencia modificadoras
Operaciones de partición
Operaciones de ordenamiento
Operaciones de búsqueda binaria (en rangos ordenados)
       
       
Operaciones de conjunto (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
       
       
Operaciones de permutación
Operaciones de plegado
Operaciones en 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&
    min( 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
    min( 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>
    min( R&& r, Comp comp = {}, Proj proj = {} );
(3) (desde C++20)

Devuelve el menor de los elementos proyectados dados.

1) Devuelve el menor de a y b.
2) Devuelve el primer elemento más pequeño en la lista de inicializadores r.
3) Devuelve el primer valor más pequeño en el rango r.

Las entidades similares a funciones descritas en esta página son objetos de función de algoritmo (informalmente conocidos como niebloides), 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 menor de a y b , según la proyección. Si son equivalentes, devuelve a .
2,3) El elemento más pequeño en r , de acuerdo con la proyección. Si varios valores son equivalentes al más pequeño, 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 min_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, b), std::invoke(proj, a)) ? 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::min_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::min_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, *i), std::invoke(proj, m)))
                    m = *i;
            return m;
        }
    }
};
inline constexpr min_fn min;

Notas

Capturar el resultado de std::ranges::min 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::min(n + 2, n * 2); // r está colgando

Ejemplo

#include <algorithm>
#include <iostream>
#include <string>
int main()
{
    namespace ranges = std::ranges;
    using namespace std::string_view_literals;
    std::cout << "smaller of 1 and 9999: " << ranges::min(1, 9999) << '\n'
              << "smaller of 'a', and 'b': '" << ranges::min('a', 'b') << "'\n"
              << "shortest of \"foo\", \"bar\", and \"hello\": \""
              << ranges::min({"foo"sv, "bar"sv, "hello"sv}, {},
                             &std::string_view::size) << "\"\n";
}

Salida:

smaller of 1 and 9999: 1
smaller of 'a', and 'b': 'a'
shortest of "foo", "bar", and "hello": "foo"

Véase también

devuelve el mayor de los valores dados
(objeto función de algoritmo)
devuelve el menor y mayor de dos elementos
(objeto función de algoritmo)
devuelve el elemento más pequeño 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 menor de los valores dados
(plantilla de función)