Namespaces
Variants

std:: inplace_merge

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
inplace_merge
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Definiert im 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)

Führt zwei aufeinanderfolgende sortierte Bereiche [ first , middle ) und [ middle , last ) zu einem sortierten Bereich [ first , last ) zusammen.

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

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> ist true .

(bis C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> ist true .

(seit C++20)

Diese Merge-Funktion ist stabil, was bedeutet, dass für äquivalente Elemente in den beiden ursprünglichen Bereichen die Elemente aus dem ersten Bereich (unter Beibehaltung ihrer ursprünglichen Reihenfolge) den Elementen aus dem zweiten Bereich (unter Beibehaltung ihrer ursprünglichen Reihenfolge) vorangehen.

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

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

Inhaltsverzeichnis

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 execution policy , die verwendet werden soll
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. vor ) dem zweiten angeordnet ist.

Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein:

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

Obwohl die Signatur keine const & benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte des Typs (möglicherweise const) Type1 und Type2 unabhängig von der value category akzeptieren können (daher ist Type1& nicht erlaubt , ebenso wenig wie Type1 , es sei denn, für Type1 ist ein Move äquivalent zu einem Copy (seit C++11) ).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ BidirIt dereferenziert und dann implizit in beide konvertiert werden kann. ​

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

Ausnahmen

Die Überladungen mit einem Template-Parameter namens ExecutionPolicy melden Fehler wie folgt:

  • Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und ExecutionPolicy einer der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher allokieren kann, wird std::bad_alloc geworfen.

Mögliche Implementierung

Sehen Sie die Implementierungen in libstdc++ und libc++ .

Hinweise

Diese Funktion versucht, einen temporären Puffer zu allozieren. Falls die Allokation fehlschlägt, wird der weniger effiziente Algorithmus gewählt.

Feature-Test Makro Wert Std Feature
__cpp_lib_constexpr_algorithms 202306L (C++26) constexpr Inplace-Zusammenführung ( 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

führt zwei sortierte Bereiche zusammen
(Funktions-Template)
sortiert einen Bereich in aufsteigender Reihenfolge
(Funktions-Template)
sortiert einen Bereich von Elementen unter Beibehaltung der Reihenfolge gleicher Elemente
(Funktions-Template)
führt zwei geordnete Bereiche direkt zusammen
(Algorithmus-Funktionsobjekt)