std::forward_list<T,Allocator>::merge
| void merge( forward_list& other ); |
(1) | (seit C++11) |
| void merge( forward_list&& other ); |
(2) | (seit C++11) |
| template< class Compare > void merge( forward_list& other, Compare comp ); |
(3) | (seit C++11) |
| template< class Compare > void merge( forward_list&& other, Compare comp ); |
(4) | (seit C++11) |
Die Funktion tut nichts, wenn other auf dasselbe Objekt verweist wie *this.
Andernfalls wird other in *this integriert. Beide Listen sollten sortiert sein. Es werden keine Elemente kopiert, und der Container other wird nach dem Zusammenführen leer. Diese Operation ist stabil: Für äquivalente Elemente in den beiden Listen gehen die Elemente aus *this den Elementen aus other immer 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 weiterhin auf dieselben Elemente von *this anstelle von other.
Wenn *this oder other in Bezug auf den entsprechenden Komparator nicht sortiert ist, 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 Ausnahme-Sicherheitsgarantie). Außer wenn die Ausnahme von einem Vergleich herrührt.
[bearbeiten] Komplexität
Wenn other auf dasselbe Objekt verweist wie *this, werden keine Vergleiche durchgeführt.
Andernfalls, gegeben N als std::distance(begin(), end()) und R als std::distance(other.begin(), other.end())
[bearbeiten] 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
[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 2045 | C++11 | O(1) Knotenverschiebung konnte nicht garantiert werden, wenn get_allocator() != other.get_allocator() |
Das Verhalten ist in diesem Fall nicht definiert. |
| LWG 3088 | C++11 | die Auswirkung, wenn *this und other auf dasselbe Objekt verweisen, war nicht spezifiziert operator< könnte für Zeigerelemente fehlschlagen |
als No-Op spezifiziert implementierungsdefiniert strikte totale Ordnung verwendet |
[bearbeiten] Siehe auch
verschiebt Elemente aus einem anderen forward_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) |