std::sort
| 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.
comp.policy.true:
|
|
(hasta C++20) |
|
|
(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)
|
| 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 :
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
ExecutionPolicyes uno de los standard policies , std::terminate es llamado. Para cualquier otroExecutionPolicy, 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) | |
(C++20) |
|
| ordena un rango de elementos preservando el orden relativo entre elementos equivalentes (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++20) |
ordena un rango de elementos (objeto función de algoritmo) |