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() ? Oder std::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);
    }
    

Log in to reply