std:: inplace_merge
|
Défini dans l'en-tête
<algorithm>
|
||
|
template
<
class
BidirIt
>
void inplace_merge ( BidirIt first, BidirIt middle, BidirIt last ) ; |
(1) | (constexpr depuis C++26) |
|
template
<
class
ExecutionPolicy,
class
BidirIt
>
void
inplace_merge
(
ExecutionPolicy
&&
policy,
|
(2) | (depuis C++17) |
|
template
<
class
BidirIt,
class
Compare
>
void
inplace_merge
(
BidirIt first, BidirIt middle, BidirIt last,
|
(3) | (constexpr depuis C++26) |
|
template
<
class
ExecutionPolicy,
class
BidirIt,
class
Compare
>
void
inplace_merge
(
ExecutionPolicy
&&
policy,
|
(4) | (depuis C++17) |
Fusionne deux plages triées consécutives
[
first
,
middle
)
et
[
middle
,
last
)
en une seule plage triée
[
first
,
last
)
.
[
first
,
middle
)
ou
[
middle
,
last
)
n'est pas
trié
par rapport à
operator
<
(jusqu'à C++20)
std::
less
{
}
(depuis C++20)
, le comportement est indéfini.
[
first
,
middle
)
ou
[
middle
,
last
)
n'est pas trié par rapport à
comp
, le comportement est indéfini.
|
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) |
Cette fonction de fusion est stable, ce qui signifie que pour les éléments équivalents dans les deux plages d'origine, les éléments de la première plage (préservant leur ordre d'origine) précèdent les éléments de la seconde plage (préservant leur ordre d'origine).
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 | - | le début de la première plage triée |
| middle | - | la fin de la première plage triée et le début de la seconde |
| last | - | la fin de la seconde plage triée |
| 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 du type (éventuellement const)
|
| Exigences de type | ||
-
BidirIt
doit satisfaire aux exigences de
LegacyBidirectionalIterator
.
|
||
-
Compare
doit satisfaire aux exigences de
Compare
.
|
||
Complexité
Étant donné N comme std:: distance ( first, last ) :
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 les implémentations dans libstdc++ et libc++ .
Notes
Cette fonction tente d'allouer un tampon temporaire. Si l'allocation échoue, l'algorithme moins efficace est choisi.
| Macro de test de fonctionnalité | Valeur | Norme | Fonctionnalité |
|---|---|---|---|
__cpp_lib_constexpr_algorithms
|
202306L
|
(C++26) | constexpr fusion en place ( 1 ) , ( 3 ) |
Exemple
Le code suivant est une implémentation du tri par fusion.
#include <algorithm> #include <iostream> #include <vector> template<class Iter> void merge_sort(Iter first, Iter last) { if (last - first > 1) { Iter middle = first + (last - first) / 2; merge_sort(first, middle); merge_sort(middle, last); std::inplace_merge(first, middle, last); } } int main() { std::vector<int> v{8, 2, -2, 0, 11, 11, 1, 7, 3}; merge_sort(v.begin(), v.end()); for (const auto& n : v) std::cout << n << ' '; std::cout << '\n'; }
Sortie :
-2 0 1 2 3 7 8 11 11
Voir aussi
|
fusionne deux plages triées
(modèle de fonction) |
|
|
trie une plage en ordre croissant
(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)
|
fusionne deux plages ordonnées en place
(objet fonction algorithme) |