Namespaces
Variants

std::list<T,Allocator>:: merge

From cppreference.net

void merge ( list & other ) ;
(1) (constexpr seit C++26)
void merge ( list && other ) ;
(2) (seit C++11)
(constexpr seit C++26)
template < class Compare >
void merge ( list & other, Compare comp ) ;
(3) (constexpr seit C++26)
template < class Compare >
void merge ( list && other, Compare comp ) ;
(4) (seit C++11)
(constexpr seit C++26)

Führt zwei sortierte Listen zu einer sortierten Liste zusammen.

  • Wenn other auf dasselbe Objekt wie * this verweist, wird nichts unternommen.
  • Andernfalls werden alle Elemente von other zu * this übertragen. other ist nach dem Zusammenführen leer.

Dieser Vorgang ist stabil:

  • Für äquivalente Elemente in den beiden Listen gehen die Elemente von * this stets den Elementen von other voraus.
  • Die Reihenfolge äquivalenter Elemente von * this und other ändert sich nicht.
1,2) Entspricht merge ( other, std:: less < T > ( ) ) (bis C++14) merge ( other, std:: less <> ( ) ) (seit C++14) .
3,4) Elemente werden mit comp verglichen.
Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:
  • * this oder other ist nicht sortiert bezüglich des Vergleichs comp .
  • get_allocator ( ) == other. get_allocator ( ) ist false .

Keine Iteratoren oder Referenzen werden ungültig. Die Zeiger und Referenzen auf die Elemente, die von * this verschoben wurden, sowie die Iteratoren, die auf diese Elemente verweisen, werden auf dieselben Elemente von * this verweisen, anstatt auf other .

Inhaltsverzeichnis

Parameter

other - ein weiterer Container zur Zusammenführung
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) das zweite Argument ist.

Die Signatur der Vergleichsfunktion sollte folgender entsprechen:

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

Obwohl die Signatur nicht const & benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte der Typen (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren können (daher ist Type1& nicht erlaubt , ebenso wenig wie Type1 , es sei denn, für Type1 ist eine Verschiebung äquivalent zu einer Kopie (seit C++11) ).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ list < T, Allocator > :: const_iterator dereferenziert und dann implizit in beide konvertiert werden kann. ​

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

Ausnahmen

Wenn aus irgendeinem Grund eine Exception ausgelöst wird, haben diese Funktionen keine Wirkung ( strong exception safety guarantee ). Außer wenn die Exception von einem Vergleich stammt.

Komplexität

Wenn other auf dasselbe Objekt wie * this verweist, werden keine Vergleiche durchgeführt.

Andernfalls, gegeben N 1 als std:: distance ( begin ( ) , end ( ) ) und N 2 als std:: distance ( other. begin ( ) , other. end ( ) ) :

1,2) Höchstens N 1 +N 2 -1 Vergleiche unter Verwendung von operator < .
3,4) Höchstens N 1 +N 2 -1 Anwendungen der Vergleichsfunktion comp .

Beispiel

#include <iostream>
#include <list>
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
    for (const int i : list)
        ostr << ' ' << i;
    return ostr;
}
int main()
{
    std::list<int> list1 = {5, 9, 1, 3, 3};
    std::list<int> list2 = {8, 7, 2, 3, 4, 4};
    list1.sort();
    list2.sort();
    std::cout << "list1: " << list1 << '\n';
    std::cout << "list2: " << list2 << '\n';
    list1.merge(list2);
    std::cout << "merged:" << list1 << '\n';
}

Ausgabe:

list1:  1 3 3 5 9
list2:  2 3 4 4 7 8
merged: 1 2 3 3 3 4 4 5 7 8 9

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 300 C++98 Der Effekt, wenn * this und other auf dasselbe
Objekt verweisen, war nicht spezifiziert
als No-Op spezifiziert
LWG 1207 C++98 Es war unklar, ob Iteratoren und/oder Referenzen ungültig werden gültig bleiben
LWG 1215 C++98 O(1) Knotenverschiebung konnte nicht garantiert werden, wenn
get_allocator ( ) ! = other. get_allocator ( )
Das Verhalten ist
in diesem Fall undefiniert
LWG 3088 C++98 operator < konnte sich bei Zeigerelementen fehlerhaft verhalten Implementierungsdefinierte
strikte Totalordnung verwendet

Siehe auch

überträgt Elemente aus einer anderen list
(öffentliche Elementfunktion)
vereinigt zwei sortierte Bereiche
(Funktionstemplate)
vereinigt zwei geordnete Bereiche direkt
(Funktionstemplate)
vereinigt zwei sortierte Bereiche
(Algorithmus-Funktionsobjekt)
vereinigt zwei geordnete Bereiche direkt
(Algorithmus-Funktionsobjekt)