std::list<T,Allocator>::merge
| void merge( list& other ); |
(1) | |
| void merge( list&& other ); |
(2) | (seit C++11) |
| template< class Compare > void merge( list& other, Compare comp ); |
(3) | |
| template< class Compare > void merge( list&& other, Compare comp ); |
(4) | (seit C++11) |
Die Funktion tut nichts, wenn other auf dasselbe Objekt wie *this verweist.
Andernfalls werden die Elemente von other in *this zusammengeführt. Beide Listen sollten sortiert sein. Es werden keine Elemente kopiert, und der Container other wird nach dem Zusammenführen leer. Diese Operation ist stabil: Bei äquivalenten Elementen in den beiden Listen gehen die Elemente aus *this immer den Elementen aus other voraus, und die Reihenfolge äquivalenter Elemente von *this und other ändert sich nicht.
Keine Iteratoren oder Referenzen werden ungültig. Die Zeiger und Referenzen auf die verschobenen Elemente aus *this sowie die auf diese Elemente verweisenden Iteratoren verweisen auf dieselben Elemente von *this anstelle von other.
Wenn *this oder other in Bezug auf den entsprechenden Komparator nicht sortiert sind, oder get_allocator() != other.get_allocator(), ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Parameter
| Sonstiges | - | ein weiterer Container, der zusammengeführt 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 | ||
-Compare muss die Anforderungen an Compare erfüllen. | ||
[bearbeiten] Rückgabewert
(keine)
[bearbeiten] Ausnahmen
Wenn aus irgendeinem Grund eine Ausnahme ausgelöst wird, haben diese Funktionen keine Auswirkung (starke Garantien für die Ausnahmesicherheit). Es sei denn, die Ausnahme stammt von einem Vergleich.
[bearbeiten] Komplexität
Wenn other auf dasselbe Objekt wie *this verweist, werden keine Vergleiche durchgeführt.
Andernfalls, wobei N als std::distance(begin(), end()) und R als std::distance(other.begin(), other.end()) bezeichnet
[bearbeiten] 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
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 300 | C++98 | die Auswirkung, wenn *this und other sich auf dasselbe Objekt beziehen, wurde nicht spezifiziert |
als No-Op spezifiziert |
| LWG 1207 | C++98 | war unklar, ob Iteratoren und/oder Referenzen ungültig werden | gültig bleiben |
| LWG 1215 | C++98 | O(1) Knotenverschiebungen konnten nicht garantiert werden, wenn get_allocator() != other.get_allocator() |
Das Verhalten ist in diesem Fall nicht definiert. |
| LWG 3088 | C++98 | operator< sich bei Zeigerelementen falsch verhalten konnte | implementierungsdefiniert strikte totale Ordnung verwendet |
[bearbeiten] Siehe auch
verschiebt Elemente aus einer anderen list(öffentliche Memberfunktion) | |
| Führt zwei sortierte Bereiche zusammen (Funktionstemplate) | |
| Führt zwei sortierte Bereiche an Ort und Stelle zusammen (Funktionstemplate) | |
| (C++20) |
Führt zwei sortierte Bereiche zusammen (Algorithmus-Funktionsobjekt) |
| (C++20) |
Führt zwei sortierte Bereiche an Ort und Stelle zusammen (Algorithmus-Funktionsobjekt) |