std::inplace_merge
| 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, |
(2) | (seit C++17) |
template< class BidirIt, class Compare > void inplace_merge( BidirIt first, BidirIt middle, BidirIt last, |
(3) | (constexpr seit C++26) |
| template< class ExecutionPolicy, class BidirIt, class Compare > void inplace_merge( ExecutionPolicy&& policy, |
(4) | (seit C++17) |
Führt zwei aufeinanderfolgende sortierte Bereiche [first, middle) und [middle, last) zu einem sortierten Bereich [first, last) zusammen.
[first, middle) oder [middle, last) nicht sortiert ist bezüglich operator<(bis C++20)std::less{}(seit C++20), ist das Verhalten undefiniert.[first, middle) oder [middle, last) nicht sortiert ist bezüglich comp, ist das Verhalten undefiniert.|
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 Zusammenführungsfunktion ist stabil, was bedeutet, dass für gleichwertige Elemente in den ursprünglichen beiden 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
-
[first,middle)oder[middle,last)ist kein gültiger Bereich.
|
(bis C++11) |
|
(seit C++11) |
Inhalt |
[edit] 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, die verwendet werden soll |
| comp | - | Vergleichsfunktions-Objekt (d.h. ein Objekt, das die Anforderungen an Compare erfüllt), das true zurückgibt, wenn das erste Argument *weniger* (d.h. *vorher*) als das zweite geordnet ist. Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein bool cmp(const Type1& a, const Type2& b); Obwohl die Signatur nicht unbedingt const& haben muss, darf die Funktion die übergebenen Objekte nicht verändern und muss in der Lage sein, alle Werte vom Typ (möglicherweise const) |
| Typanforderungen | ||
-BidirIt muss die Anforderungen von LegacyBidirectionalIterator erfüllen. | ||
-Compare muss die Anforderungen an Compare erfüllen. | ||
[edit] Komplexität
Gegeben sei N als std::distance(first, last).
[edit] Ausnahmen
Die Überladungen mit einem Template-Parameter namens ExecutionPolicy berichten Fehler wie folgt
- Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsabhängig. - Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.
[edit] Mögliche Implementierung
Siehe die Implementierungen in libstdc++ und libc++.
[edit] Hinweise
Diese Funktion versucht, einen temporären Puffer zu allokieren. Schlägt die Allokation fehl, wird der weniger effiziente Algorithmus gewählt.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_constexpr_algorithms |
202306L |
(C++26) | constexpr inplace merging (1), (3) |
[edit] 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
[edit] Siehe auch
| Führt zwei sortierte Bereiche zusammen (Funktionstemplate) | |
| Sortiert einen Bereich aufsteigend (Funktionstemplate) | |
| Sortiert einen Bereich von Elementen und behält dabei die Reihenfolge zwischen gleichen Elementen bei (Funktionstemplate) | |
| (C++20) |
Führt zwei sortierte Bereiche an Ort und Stelle zusammen (Algorithmus-Funktionsobjekt) |