std:: partial_sort
|
Défini dans l'en-tête
<algorithm>
|
||
|
template
<
class
RandomIt
>
void partial_sort ( RandomIt first, RandomIt middle, RandomIt last ) ; |
(1) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
RandomIt
>
void
partial_sort
(
ExecutionPolicy
&&
policy,
|
(2) | (depuis C++17) |
|
template
<
class
RandomIt,
class
Compare
>
void
partial_sort
(
RandomIt first, RandomIt middle, RandomIt last,
|
(3) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
RandomIt,
class
Compare
>
void
partial_sort
(
ExecutionPolicy
&&
policy,
|
(4) | (depuis C++17) |
Réorganise les éléments de telle sorte que la plage
[
first
,
middle
)
contienne les
middle − first
plus petits éléments triés de la plage
[
first
,
last
)
.
L'ordre des éléments égaux n'est pas garanti d'être préservé. L'ordre des éléments restants dans la plage
[
middle
,
last
)
n'est pas spécifié.
|
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 :
-
[first,middle)ou[middle,last)n'est pas un intervalle valide .
|
(jusqu'à C++11) |
|
(depuis C++11) |
Table des matières |
Paramètres
| first, last | - | la paire d'itérateurs définissant la plage des éléments à réorganiser |
| middle | - |
la plage
[
first
,
middle
)
contiendra les éléments triés
|
| 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é M comme middle - first , 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++ .
| partial_sort (1) |
|---|
template<typename RandomIt> constexpr //< since C++20 void partial_sort(RandomIt first, RandomIt middle, RandomIt last) { typedef typename std::iterator_traits<RandomIt>::value_type VT; std::partial_sort(first, middle, last, std::less<VT>()); } |
| partial_sort (3) |
namespace impl { template<typename RandomIt, typename Compare> constexpr //< since C++20 void sift_down(RandomIt first, RandomIt last, const Compare& comp) { // sift down element at “first” const auto length = static_cast<std::size_t>(last - first); std::size_t current = 0; std::size_t next = 2; while (next < length) { if (comp(*(first + next), *(first + (next - 1)))) --next; if (!comp(*(first + current), *(first + next))) return; std::iter_swap(first + current, first + next); current = next; next = 2 * current + 2; } --next; if (next < length && comp(*(first + current), *(first + next))) std::iter_swap(first + current, first + next); } template<typename RandomIt, typename Compare> constexpr //< since C++20 void heap_select(RandomIt first, RandomIt middle, RandomIt last, const Compare& comp) { std::make_heap(first, middle, comp); for (auto i = middle; i != last; ++i) { if (comp(*i, *first)) { std::iter_swap(first, i); sift_down(first, middle, comp); } } } } // namespace impl template<typename RandomIt, typename Compare> constexpr //< since C++20 void partial_sort(RandomIt first, RandomIt middle, RandomIt last, Compare comp) { impl::heap_select(first, middle, last, comp); std::sort_heap(first, middle, comp); } |
Notes
Algorithme
L'algorithme utilisé est généralement heap select pour sélectionner les plus petits éléments, et heap sort pour trier les éléments sélectionnés dans le tas en ordre croissant.
Pour sélectionner des éléments, un tas est utilisé (voir heap ). Par exemple, pour operator < comme fonction de comparaison, max-heap est utilisé pour sélectionner middle − first plus petits éléments.
Tri par tas
est utilisé après la sélection pour trier
[
first
,
middle
)
les éléments sélectionnés (voir
std::sort_heap
).
Utilisation prévue
std::partial_sort
algorithmes sont destinés à être utilisés pour des
petits nombres constants
d'éléments sélectionnés dans
[
first
,
middle
)
.
Exemple
#include <algorithm> #include <array> #include <functional> #include <iostream> void print(const auto& s, int middle) { for (int a : s) std::cout << a << ' '; std::cout << '\n'; if (middle > 0) { while (middle-- > 0) std::cout << "--"; std::cout << '^'; } else if (middle < 0) { for (auto i = s.size() + middle; --i; std::cout << " ") {} for (std::cout << '^'; middle++ < 0; std::cout << "--") {} } std::cout << '\n'; }; int main() { std::array<int, 10> s{5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; print(s, 0); std::partial_sort(s.begin(), s.begin() + 3, s.end()); print(s, 3); std::partial_sort(s.rbegin(), s.rbegin() + 4, s.rend()); print(s, -4); std::partial_sort(s.rbegin(), s.rbegin() + 5, s.rend(), std::greater{}); print(s, -5); }
Sortie possible :
5 7 4 2 8 6 1 9 0 3
0 1 2 7 8 6 5 9 4 3
------^
4 5 6 7 8 9 3 2 1 0
^--------
4 3 2 1 0 5 6 7 8 9
^----------
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é |
|---|---|---|---|
| P0896R4 | C++98 |
[
first
,
middle
)
et
[
middle
,
last
)
n'étaient pas requis d'être des plages valides |
le comportement est indéfini
si l'une d'entre elles est invalide |
Voir aussi
|
trie partiellement la plage donnée en s'assurant qu'elle est partitionnée par l'élément donné
(modèle de fonction) |
|
|
copie et trie partiellement une plage d'éléments
(modèle de fonction) |
|
|
trie une plage d'éléments en préservant l'ordre entre les éléments égaux
(modèle de fonction) |
|
|
trie une plage par ordre croissant
(modèle de fonction) |
|
|
(C++20)
|
trie les N premiers éléments d'une plage
(objet fonction algorithme) |