Namespaces
Variants

std::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 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
(until C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

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

Operaciones de ordenación
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


 
Definido en el encabezado <algorithm>
template< class RandomIt >
void sort( RandomIt first, RandomIt last );
(1) (constexpr desde C++20)
template< class ExecutionPolicy, class RandomIt >
void sort( ExecutionPolicy&& policy,
           RandomIt first, RandomIt last );
(2) (desde C++17)
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
(3) (constexpr desde C++20)
template< class ExecutionPolicy, class RandomIt, class Compare >
void sort( ExecutionPolicy&& policy,
           RandomIt first, RandomIt last, Compare comp );
(4) (desde C++17)

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

1) Los elementos se ordenan con respecto a operator<(hasta C++20)std::less{}(desde C++20).
3) Los elementos se ordenan con respecto a comp.
2,4) Igual que (1,3), pero se ejecuta de acuerdo con policy.
Estas sobrecargas participan en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(hasta C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(desde C++20)

Si se cumple alguna de las siguientes condiciones, el comportamiento no está definido:

(hasta C++11)
(desde C++11)

Parámetros

first, last - el par de iteradores que define el rango de elementos a ordenar
policy - la política de ejecución a utilizar
comp - objeto función de comparación (es decir, un objeto que satisface los requisitos de Compare ) que devuelve ​ true si el primer argumento es menor que (es decir, está ordenado antes que) el segundo.

La firma de la función de comparación debe ser equivalente a la siguiente:

bool cmp ( const Type1 & a, const Type2 & b ) ;

Aunque la firma no necesita tener const & , la función no debe modificar los objetos pasados a ella y debe poder aceptar todos los valores de tipo (posiblemente const) Type1 y Type2 independientemente de la categoría de valor (por lo tanto, Type1& no está permitido , ni tampoco Type1 a menos que para Type1 un movimiento sea equivalente a una copia (since C++11) ).
Los tipos Type1 y Type2 deben ser tales que un objeto de tipo RandomIt pueda ser desreferenciado y luego convertido implícitamente a ambos. ​

Requisitos de tipo
-
RandomIt debe cumplir con los requisitos de LegacyRandomAccessIterator .
-
Compare debe cumplir con los requisitos de Compare .

Complejidad

Dado N como last - first :

1,2) O(N·log(N)) comparaciones usando operator < (hasta C++20) std:: less { } (desde C++20) .
3,4) O(N·log(N)) aplicaciones del comparador comp .

Excepciones

Las sobrecargas con un parámetro de plantilla llamado ExecutionPolicy reportan errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es uno de los standard policies , std::terminate es llamado. Para cualquier otro ExecutionPolicy , el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.

Implementación posible

Consulte también las implementaciones en libstdc++ y libc++ .

Notas

Antes de LWG713 , el requisito de complejidad permitía que sort() se implementara utilizando únicamente Quicksort , lo cual podría requerir O(N 2
)
comparaciones en el peor caso.

Introsort puede manejar todos los casos con O(N·log(N)) comparaciones (sin incurrir en sobrecarga adicional en el caso promedio), y por lo tanto se utiliza generalmente para implementar sort() .

libc++ no ha implementado el requisito de complejidad temporal corregido hasta LLVM 14 .

Ejemplo

#include <algorithm>
#include <array>
#include <functional>
#include <iostream>
#include <string_view>
int main()
{
    std::array<int, 10> s{5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
    auto print = [&s](std::string_view const rem)
    {
        for (auto a : s)
            std::cout << a << ' ';
        std::cout << ": " << rem << '\n';
    };
    std::sort(s.begin(), s.end());
    print("ordenado con el operador< predeterminado");
    std::sort(s.begin(), s.end(), std::greater<int>());
    print("ordenado con el objeto función de comparación de la biblioteca estándar");
    struct
    {
        bool operator()(int a, int b) const { return a < b; }
    }
    customLess;
    std::sort(s.begin(), s.end(), customLess);
    print("ordenado con un objeto función personalizado");
    std::sort(s.begin(), s.end(), [](int a, int b)
                                  {
                                      return a > b;
                                  });
    print("ordenado con una expresión lambda");
}

Salida:

0 1 2 3 4 5 6 7 8 9 : ordenado con el operador< predeterminado
9 8 7 6 5 4 3 2 1 0 : ordenado con el objeto función de comparación de la biblioteca estándar
0 1 2 3 4 5 6 7 8 9 : ordenado con un objeto función personalizado
9 8 7 6 5 4 3 2 1 0 : ordenado con una expresión lambda

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 713 C++98 la complejidad temporal de O(N·log(N)) solo se requería en promedio se requiere para el peor caso

Véase también

ordena los primeros N elementos de un rango
(plantilla de función & objeto función de algoritmo)
ordena un rango de elementos preservando el orden relativo entre elementos equivalentes
(plantilla de función & objeto función de algoritmo)
ordena un rango de elementos
(objeto función de algoritmo)