Problem mit splice()
-
Hallo Forum,
habe ungefähr so eine Situation:
// li: 1 2 3 4 5 6 7 8 9 10 list<int> li; for (unsigned int i = 1 ; i <= 10 ; i++) li.push_back(i); // Bereich: range_begin = 4 // range_end = 8 list<int>::iterator range_begin = li.begin(), range_end = li.end(); for (unsigned int i = 0 ; i < 3 ; i++) { range_begin++; range_end--; } // Alle Werte aus [range_begin,range_end) die größer als 5 sind // an den Anfang [von range_begin,range_end) verschieben for (list<int>::iterator i = range_begin ; i != range_end ; i++) li.splice(range_begin, li, i); // li: 1 2 3 6 7 4 5 8 9 10
Am Ende diesen Abschnittes zeigt (wie zu erwarten) der Iterator
range_begin
immer noch auf 4.
Die Anzahl der Elemente in[range_begin,range_end)
hat sich also verringert.
Die Größe sollte aber eigentlich gleich bleiben, d.h. range_begin soll hier auf die sechs verweisen...
Lässt sich das realisieren?
-
Warum nicht
std::partition()
? Oderstd::stable_partition()
, falls die Originalreihenfolge der Elemente innerhalb der gleichen Teilsequenz erhalten werden soll?#include <list> #include <algorithm> bool GreaterThan5(int Value) { return Value > 5; } int main() { std::list<int> li; for (unsigned int i = 1 ; i <= 10 ; i++) li.push_back(i); std::partition(li.begin(), li.end(), GreaterThan5); }