Namespaces
Variants

std::inplace_merge

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les vues (C++20)
Algorithmes contraints, p.ex. ranges::copy, ranges::sort, ...
Opérations séquentielles non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations séquentielles modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations associées
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des vues partitionnées)
Opérations d'ensemble (sur des vues triées)
Opérations de fusion (sur des vues triées)
Opérations de tas
Opérations minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
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 [firstmiddle) et [middlelast) en une seule vue triée [firstlast).

1) Si [firstmiddle) ou [middlelast) n'est pas trié(e) par rapport à operator<(jusqu'à C++20)std::less{}(depuis C++20), le comportement est indéfini.
3) Si [firstmiddle) ou [middlelast) n'est pas trié(e) par rapport à comp, le comportement est indéfini.
2,4) Identique à (1,3), mais exécuté selon policy.
Ces surcharges ne participent à la résolution de surcharge que si la valeur de l'expression suivante est true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(jusqu'à C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(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 :

  • [firstmiddle) ou [middlelast) 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 :

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 être capable d'accepter toutes les valeurs de type (possiblement const) Type1 et Type2 indépendamment de la catégorie de valeur (ainsi, Type1& n'est pas autorisé, ni Type1 sauf si pour Type1 un déplacement est équivalent à une copie(depuis C++11)).
Les types Type1 et Type2 doivent être tels qu'un objet de type BidirIt puisse être déréférencé puis implicitement converti vers les deux. ​

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) :

1) Exactement N-1 comparaisons en utilisant operator<(jusqu'à C++20)std::less{}(depuis C++20) si suffisamment de mémoire supplémentaire est disponible, O(N⋅log(N)) comparaisons autrement.
2) O(N⋅log(N)) comparaisons en utilisant operator<(jusqu'à C++20)std::less{}(depuis C++20).
3) Exactement N-1 applications de la fonction de comparaison comp si suffisamment de mémoire supplémentaire est disponible, O(N⋅log(N)) applications autrement.
4) O(N⋅log(N)) applications de la fonction de comparaison 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 ExecutionPolicy est l'une des politiques standard, std::terminate est appelé. Pour toute autre ExecutionPolicy, 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)
trie une vue d'éléments
(modèle de fonction & objet fonction d'algorithme)
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)
fusionne deux vues ordonnées sur place
(objet fonction d'algorithme)