Namespaces
Variants

std::inplace_merge

Von de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z. B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Stapeloperationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Swap-Operationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Definiert in Header <algorithm>
template< class BidirIt >
void inplace_merge( BidirIt first, BidirIt middle, BidirIt last );
(1) (constexpr seit C++26)
template< class ExecutionPolicy, class BidirIt >
void inplace_merge( ExecutionPolicy&& policy,
                    BidirIt first, BidirIt middle, BidirIt last );
(2) (seit C++17)
template< class BidirIt, class Compare >
void inplace_merge( BidirIt first, BidirIt middle, BidirIt last,
                    Compare comp );
(3) (constexpr seit C++26)
template< class ExecutionPolicy, class BidirIt, class Compare >
void inplace_merge( ExecutionPolicy&& policy,
                    BidirIt first, BidirIt middle, BidirIt last,
                    Compare comp );
(4) (seit C++17)

Vereinigt zwei aufeinanderfolgende sortierte Bereiche [first, middle) und [middle, last) zu einem sortierten Bereich [first, last).

1) Wenn [first, middle) oder [middle, last) nicht sortiert bezüglich operator<(bis C++20)std::less{}(seit C++20) ist, ist das Verhalten undefiniert.
3) Wenn [first, middle) oder [middle, last) nicht sortiert bezüglich comp ist, ist das Verhalten undefiniert.
2,4) Wie (1,3), aber ausgeführt gemäß policy.
Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn der Wert des folgenden Ausdrucks true ist:

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

(bis C++20)

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

(seit C++20)

Diese Mischfunktion ist stabil, d. h. für äquivalente Elemente in den beiden ursprünglichen Bereichen gehen die Elemente aus dem ersten Bereich (unter Beibehaltung ihrer ursprünglichen Reihenfolge) den Elementen aus dem zweiten Bereich (unter Beibehaltung ihrer ursprünglichen Reihenfolge) voraus.

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:

(bis C++11)
(seit C++11)

Parameter

first - der Anfang des ersten sortierten Bereichs
middle - das Ende des ersten sortierten Bereichs und der Anfang des zweiten
last - das Ende des zweiten sortierten Bereichs
policy - die Ausführungsrichtlinie zur Verwendung
comp - Vergleichsfunktionsobjekt (d. h. ein Objekt, das die Anforderungen von Compare erfüllt), das true zurückgibt, wenn das erste Argument kleiner als (d. h. geordnet vor) dem zweiten ist.

Die Signatur der Vergleichsfunktion sollte der folgenden entsprechen:

bool cmp(const Type1& a, const Type2& b);

Obwohl die Signatur kein const& haben muss, darf die Funktion die ihr übergebenen Objekte nicht verändern und muss in der Lage sein, alle Werte des Typs (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie zu akzeptieren (daher ist Type1& nicht erlaubt, ebenso wenig Type1 es sei denn, für Type1 ist eine Bewegung gleichwertig mit einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so sein, dass ein Objekt vom Typ BidirIt dereferenziert und dann implizit in beide konvertiert werden kann. ​

Typanforderungen
-
BidirIt muss die Anforderungen von LegacyBidirectionalIterator erfüllen.
-
Compare muss die Anforderungen von Compare erfüllen.

Komplexität

Gegeben N als std::distance(first, last):

1) Genau N-1 Vergleiche mit operator<(bis C++20)std::less{}(seit C++20) wenn genügend zusätzlicher Speicher verfügbar ist, andernfalls O(N⋅log(N)) Vergleiche.
2) O(N⋅log(N)) Vergleiche mit operator<(bis C++20)std::less{}(seit C++20).
3) Genau N-1 Anwendungen der Vergleichsfunktion comp wenn genügend zusätzlicher Speicher verfügbar ist, andernfalls O(N⋅log(N)) Anwendungen.
4) O(N⋅log(N)) Anwendungen der Vergleichsfunktion comp.

Ausnahmen

Die Überladungen mit einem Vorlagenparameter namens ExecutionPolicy melden Fehler wie folgt:

  • Wenn die Ausführung einer im Rahmen des Algorithmus aufgerufenen Funktion eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc ausgelöst.

Mögliche Implementierung

Siehe die Implementierungen in libstdc++ und libc++.

Hinweise

Diese Funktion versucht, einen temporären Puffer zuzuweisen. Wenn die Zuweisung fehlschlägt, wird der weniger effiziente Algorithmus gewählt.

Feature-Test-Makro Wert Std Merkmal
__cpp_lib_constexpr_algorithms 202306L (C++26) constexpr Inplace-Merging (1), (3)

Beispiel

Der folgende Code ist eine Implementierung von Merge-Sort.

#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';
}

Ausgabe:

-2 0 1 2 3 7 8 11 11

Siehe auch

vereinigt zwei sortierte Bereiche
(Funktionsschablone & Algorithmus-Funktionsobjekt)
sortiert einen Bereich von Elementen
(Funktionsschablone & Algorithmus-Funktionsobjekt)
sortiert einen Bereich von Elementen und erhält dabei die relative Reihenfolge äquivalenter Elemente
(Funktionsschablone & Algorithmus-Funktionsobjekt)
vereinigt zwei geordnete Bereiche direkt
(Algorithmus-Funktionsobjekt)