Namespaces
Variants

std::ranges:: sort

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 < 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 decreciente. No se garantiza que se preserve 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 utilizando la función de comparación binaria proporcionada comp .
2) Igual que (1) , pero utiliza 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 algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

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 preservando el orden entre elementos iguales
(objeto función de algoritmo)
divide un rango de elementos en dos grupos
(objeto función de algoritmo)
ordena un rango en orden ascendente
(plantilla de función)