Namespaces
Variants

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

From cppreference.net

void merge ( forward_list & other ) ;
(1) (seit C++11)
(constexpr seit C++26)
void merge ( forward_list && other ) ;
(2) (seit C++11)
(constexpr seit C++26)
template < class Compare >
void merge ( forward_list & other, Compare comp ) ;
(3) (seit C++11)
(constexpr seit C++26)
template < class Compare >
void merge ( forward_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 forward_list < T, Allocator > :: const_iterator dereferenziert und dann implizit in beide konvertiert werden kann. ​

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

Exceptions

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 <forward_list>
std::ostream& operator<<(std::ostream& ostr, const std::forward_list<int>& list)
{
    for (const int i : list)
        ostr << ' ' << i;
    return ostr;
}
int main()
{
    std::forward_list<int> list1 = {5, 9, 1, 3, 3};
    std::forward_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 2045 C++11 O(1) Knotenverschiebung konnte nicht garantiert werden, wenn
get_allocator ( ) ! = other. get_allocator ( )
das Verhalten ist
in diesem Fall undefiniert
LWG 3088 C++11 der Effekt, wenn * this und other auf dasselbe
Objekt verweisen, war nicht spezifiziert
operator < konnte sich für Zeigerelemente falsch verhalten
als No-Op spezifiziert
implementierungsdefiniert
strenge Totalordnung verwendet

Siehe auch

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