std:: sort
|
Défini dans l'en-tête
<algorithm>
|
||
|
template
<
class
RandomIt
>
void sort ( RandomIt first, RandomIt last ) ; |
(1) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
RandomIt
>
void
sort
(
ExecutionPolicy
&&
policy,
|
(2) | (depuis C++17) |
|
template
<
class
RandomIt,
class
Compare
>
void sort ( RandomIt first, RandomIt last, Compare comp ) ; |
(3) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
RandomIt,
class
Compare
>
void
sort
(
ExecutionPolicy
&&
policy,
|
(4) | (depuis C++17) |
Trie les éléments dans la plage
[
first
,
last
)
en ordre non décroissant. L'ordre des éléments égaux n'est pas garanti d'être préservé.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true . |
(jusqu'à C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true . |
(depuis C++20) |
Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :
|
(jusqu'à C++11) |
|
(depuis C++11) |
Table des matières |
Paramètres
| first, last | - | la paire d'itérateurs définissant la plage d'éléments à trier |
| policy | - | la politique d'exécution à utiliser |
| comp | - |
objet fonction de comparaison (c'est-à-dire un objet qui satisfait aux exigences de
Compare
) qui renvoie
true
si le premier argument est
inférieur
à (c'est-à-dire est ordonné
avant
) le second.
La signature de la fonction de comparaison doit être équivalente à ce qui suit : bool cmp ( const Type1 & a, const Type2 & b ) ;
Bien que la signature n'ait pas besoin d'avoir
const
&
, la fonction ne doit pas modifier les objets qui lui sont passés et doit pouvoir accepter toutes les valeurs de type (éventuellement const)
|
| Exigences de type | ||
-
RandomIt
doit satisfaire aux exigences de
LegacyRandomAccessIterator
.
|
||
-
Compare
doit satisfaire aux exigences de
Compare
.
|
||
Complexité
Étant donné N comme last - first :
Exceptions
Les surcharges avec un paramètre de modèle nommé
ExecutionPolicy
signalent les erreurs comme suit :
-
Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, le comportement est défini par l'implémentation. - Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.
Implémentation possible
Voir également les implémentations dans libstdc++ et libc++ .
Notes
Avant
LWG713
, l'exigence de complexité permettait à
sort()
d'être implémenté en utilisant uniquement
Quicksort
, ce qui pouvait nécessiter
O(N
2
)
comparaisons dans le pire cas.
Introsort
peut traiter tous les cas avec
O(N·log(N))
comparaisons (sans entraîner de surcharge supplémentaire dans le cas moyen), et est donc généralement utilisé pour implémenter
sort()
.
libc++ n'a pas implémenté l'exigence corrigée de complexité temporelle jusqu'à LLVM 14 .
Exemple
#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("sorted with the default operator<"); std::sort(s.begin(), s.end(), std::greater<int>()); print("sorted with the standard library compare function object"); struct { bool operator()(int a, int b) const { return a < b; } } customLess; std::sort(s.begin(), s.end(), customLess); print("sorted with a custom function object"); std::sort(s.begin(), s.end(), [](int a, int b) { return a > b; }); print("sorted with a lambda expression"); }
Sortie :
0 1 2 3 4 5 6 7 8 9 : sorted with the default operator< 9 8 7 6 5 4 3 2 1 0 : sorted with the standard library compare function object 0 1 2 3 4 5 6 7 8 9 : sorted with a custom function object 9 8 7 6 5 4 3 2 1 0 : sorted with a lambda expression
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 713 | C++98 | la complexité temporelle O(N·log(N)) n'était requise qu'en moyenne | elle est requise dans le pire cas |
Voir aussi
|
trie les N premiers éléments d'une plage
(modèle de fonction) |
|
|
trie une plage d'éléments en préservant l'ordre entre les éléments égaux
(modèle de fonction) |
|
|
(C++20)
|
trie une plage en ordre croissant
(objet fonction algorithme) |