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,
BidirIt first, BidirIt middle, BidirIt last );
|
(2) | (depuis C++17) |
template< class BidirIt, class Compare >
void inplace_merge( BidirIt first, BidirIt middle, BidirIt last,
Compare comp );
|
(3) | (constexpr depuis C++26) |
template< class ExecutionPolicy, class BidirIt, class Compare >
void inplace_merge( ExecutionPolicy&& policy,
BidirIt first, BidirIt middle, BidirIt last,
Compare comp );
|
(4) | (depuis C++17) |
Fusionne deux vues triées consécutives [first, middle) et [middle, last) en une seule vue triée [first, last).
[first, middle) ou [middle, last) n'est pas trié(e) 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é(e) par rapport à comp, le comportement est indéfini.policy.true:
|
|
(jusqu'à C++20) |
|
|
(depuis C++20) |
Cette fonction de fusion est stable, ce qui signifie que pour les éléments équivalents dans les deux vues d'origine, les éléments de la première vue (en conservant leur ordre original) précèdent les éléments de la deuxième vue (en conservant leur ordre original).
Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :
[first,middle)ou[middle,last)n'est pas une vue valide.
|
(jusqu'à C++11) |
|
(depuis C++11) |
Paramètres
| first | - | le début de la première vue triée |
| middle | - | la fin de la première vue triée et le début de la deuxième |
| last | - | la fin de la deuxième vue triée |
| policy | - | la politique d'exécution à utiliser |
| comp | - | objet fonction de comparaison (c.-à-d. un objet qui satisfait aux exigences de Compare) qui retourne true si le premier argument est inférieur au second (c.-à-d. est ordonné avant le second). La signature de la fonction de comparaison doit être équivalente à la suivante :
Bien que la signature n'ait pas besoin d'avoir |
| 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) :
operator<(jusqu'à C++20)std::less{}(depuis C++20) si suffisamment de mémoire supplémentaire est disponible, O(N⋅log(N)) comparaisons autrement.operator<(jusqu'à C++20)std::less{}(depuis C++20).comp si suffisamment de mémoire supplémentaire est disponible, O(N⋅log(N)) applications autrement.comp.Exceptions
Les surcharges avec un paramètre template 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
ExecutionPolicyest l'une des politiques standard, std::terminate est appelé. Pour toute 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.
| Test de fonctionnalité macro | Valeur | Norme | Fonctionnalité |
|---|---|---|---|
__cpp_lib_constexpr_algorithms |
202306L |
(C++26) | constexpr fusion sur place (1), (3)
|
Exemple
Le code suivant est une implémentation du tri 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 vues triées (modèle de fonction & objet fonction d'algorithme) | |
(C++20) |
|
| trie une vue d'éléments (modèle de fonction & objet fonction d'algorithme) | |
(C++20) |
|
| trie une vue d'éléments tout en préservant l'ordre relatif entre éléments équivalents (modèle de fonction & objet fonction d'algorithme) | |
(C++20) |
|
(C++20) |
fusionne deux vues ordonnées sur place (objet fonction d'algorithme) |