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,
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).
[first, middle) oder [middle, last) nicht sortiert bezüglich operator<(bis C++20)std::less{}(seit C++20) ist, ist das Verhalten undefiniert.[first, middle) oder [middle, last) nicht sortiert bezüglich comp ist, ist das Verhalten undefiniert.policy.true ist:
|
|
(bis C++20) |
|
|
(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:
[first,middle)oder[middle,last)ist kein gültiger Bereich.
|
(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:
Obwohl die Signatur kein |
| 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):
operator<(bis C++20)std::less{}(seit C++20) wenn genügend zusätzlicher Speicher verfügbar ist, andernfalls O(N⋅log(N)) Vergleiche.operator<(bis C++20)std::less{}(seit C++20).comp wenn genügend zusätzlicher Speicher verfügbar ist, andernfalls O(N⋅log(N)) Anwendungen.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
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist 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) | |
(C++20) |
|
| sortiert einen Bereich von Elementen (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
| sortiert einen Bereich von Elementen und erhält dabei die relative Reihenfolge äquivalenter Elemente (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
(C++20) |
vereinigt zwei geordnete Bereiche direkt (Algorithmus-Funktionsobjekt) |