std:: inplace_merge
|
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,
|
(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 bezüglich
comp
sortiert ist, 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 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:
-
[first,middle)oder[middle,last)ist kein gültiger Bereich .
|
(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)
|
| 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 ) :
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
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist 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) |
|
|
(C++20)
|
führt zwei geordnete Bereiche direkt zusammen
(Algorithmus-Funktionsobjekt) |