Namespaces
Variants

std::ranges:: min

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
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 algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

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)