Namespaces
Variants

std::ranges::sort

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 modificantes    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de modificación de secuencia
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 particionamiento
(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í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 modificantes
Operaciones de modificación de secuencia
Operaciones de particionamiento
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 pliegue
Operaciones sobre almacenamiento no inicializado
Tipos de retorno
 
Definido en el encabezado <algorithm>
Firma de la llamada
template< std::random_access_iterator I, std::sentinel_for<I> S,
          class Comp = ranges::less, class Proj = std::identity >
requires std::sortable<I, Comp, Proj>
constexpr I 
    sort( I first, S last, Comp comp = {}, Proj proj = {} );
(1) (desde C++20)
template< ranges::random_access_range R, class Comp = ranges::less,
          class Proj = std::identity >
requires std::sortable<ranges::iterator_t<R>, Comp, Proj>
constexpr ranges::borrowed_iterator_t<R>
    sort( R&& r, Comp comp = {}, Proj proj = {} );
(2) (desde C++20)

Ordena los elementos en el rango [first, last) en orden no descendente. No se garantiza que se conserve el orden de los elementos equivalentes.

Una secuencia está ordenada con respecto a un comparador comp si para cualquier iterador it que apunte a la secuencia y cualquier entero no negativo n tal que it + n sea un iterador válido que apunte a un elemento de la secuencia, std::invoke(comp, std::invoke(proj, *(it + n)), std::invoke(proj, *it)) evalúa a false.

1) Los elementos se comparan usando la función de comparación binaria dada comp.
2) Igual que (1), pero usa r como el rango fuente, como si se usara ranges::begin(r) como first y ranges::end(r) como last.

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

Parámetros

first, last - el par iterador-centinela que define el rango de elementos a ordenar
r - el rango a ordenar
comp - comparación a aplicar a los elementos proyectados
proj - proyección a aplicar a los elementos

Valor de retorno

Un iterador igual a last .

Complejidad

𝓞(N·log(N)) comparaciones y proyecciones, donde N = ranges:: distance ( first, last ) .

Implementación posible

Tenga en cuenta que las implementaciones típicas utilizan Introsort . Consulte también la implementación en MSVC STL y libstdc++ .

struct sort_fn
{
    template<std::random_access_iterator I, std::sentinel_for<I> S,
             class Comp = ranges::less, class Proj = std::identity>
    requires std::sortable<I, Comp, Proj>
    constexpr I
        operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
    {
        if (first == last)
            return first;
        I last_iter = ranges::next(first, last);
        ranges::make_heap(first, last_iter, std::ref(comp), std::ref(proj));
        ranges::sort_heap(first, last_iter, std::ref(comp), std::ref(proj));
        return last_iter;
    }
    template<ranges::random_access_range R, class Comp = ranges::less,
             class Proj = std::identity>
    requires std::sortable<ranges::iterator_t<R>, Comp, Proj>
    constexpr ranges::borrowed_iterator_t<R>
        operator()(R&& r, Comp comp = {}, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(comp), std::move(proj));
    }
};
inline constexpr sort_fn sort {};

Notas

std::sort utiliza std::iter_swap para intercambiar elementos, mientras que ranges::sort en su lugar utiliza ranges::iter_swap (que realiza ADL para iter_swap , a diferencia de std::iter_swap )

Ejemplo

#include <algorithm>
#include <array>
#include <functional>
#include <iomanip>
#include <iostream>
void print(auto comment, auto const& seq, char term = ' ')
{
    for (std::cout << comment << '\n'; auto const& elem : seq)
        std::cout << elem << term;
    std::cout << '\n';
}
struct Particle
{
    std::string name; double mass; // MeV
    template<class Os> friend
    Os& operator<<(Os& os, Particle const& p)
    {
        return os << std::left << std::setw(8) << p.name << " : " << p.mass << ' ';
    }
};
int main()
{
    std::array s {5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
    namespace ranges = std::ranges;
    ranges::sort(s);
    print("Ordenar usando el operador predeterminado <", s);
    ranges::sort(s, ranges::greater());
    print("Ordenar usando un objeto función de comparación de la biblioteca estándar", s);
    struct
    {
        bool operator()(int a, int b) const { return a < b; }
    } customLess;
    ranges::sort(s.begin(), s.end(), customLess);
    print("Ordenar usando un objeto función personalizado", s);
    ranges::sort(s, [](int a, int b) { return a > b; });
    print("Ordenar usando una expresión lambda", s);
    Particle particles[]
    {
        {"Electron", 0.511}, {"Muon", 105.66}, {"Tau", 1776.86},
        {"Positron", 0.511}, {"Proton", 938.27}, {"Neutron", 939.57}
    };
    ranges::sort(particles, {}, &Particle::name);
    print("\nOrdenar por nombre usando una proyección", particles, '\n');
    ranges::sort(particles, {}, &Particle::mass);
    print("Ordenar por masa usando una proyección", particles, '\n');
}

Salida:

Ordenar usando el operador predeterminado <
0 1 2 3 4 5 6 7 8 9
Ordenar usando un objeto función de comparación de la biblioteca estándar
9 8 7 6 5 4 3 2 1 0
Ordenar usando un objeto función personalizado
0 1 2 3 4 5 6 7 8 9
Ordenar usando una expresión lambda
9 8 7 6 5 4 3 2 1 0
Ordenar por nombre usando una proyección
Electron : 0.511
Muon     : 105.66
Neutron  : 939.57
Positron : 0.511
Proton   : 938.27
Tau      : 1776.86
Ordenar por masa usando una proyección
Electron : 0.511
Positron : 0.511
Muon     : 105.66
Proton   : 938.27
Neutron  : 939.57
Tau      : 1776.86

Véase también

ordena los primeros N elementos de un rango
(objeto función de algoritmo)
ordena un rango de elementos mientras preserva el orden relativo entre elementos equivalentes
(objeto función de algoritmo)
divide un rango de elementos en dos grupos
(objeto función de algoritmo)
ordena un rango de elementos
(plantilla de función)