Fremder Iterator an std::list::erase übergeben?



  • Ist das Verhalten definiert? Mich wundert es dass es auch klappt wenn man das erste oder das letzte Element löscht. Ist im Iterator etwa auch noch die zugehörige Liste gespeichert?

    #include <list>
    #include <algorithm>
    #include <iostream>
    #include <iterator>
    
    int main ()
    {
    	std::list<int> list, dummy;
    
    	for(int i=0; i<10; ++i) {
    		list.push_back(i);
    	}
    
    	std::list<int>::iterator del = find(list.begin(), list.end(), 5);
    
    	dummy.erase(del);
    
    	std::copy(list.begin(), list.end(), std::ostream_iterator<int>(std::cout, " "));
    
    }
    

    edit: Habs getesten mit MS Vc2003

    edit2: Habe bemerkt dass die Größe (list::size) 10 bleibt, aber warum kann man den Anfang löschen, das darf doch normal nicht gehen 😕

    std::list<int> list, dummy;
    /* list füllen */
    dummy.erase(list.begin());
    *list.begin() = 100; // geht, warum?
    

    Eigentlich müsste doch der Pointer in list für den Anfang jetzt ins Nirvana zeigen?

    Gruß



  • Ist nicht definiert. STLport mit SafeIterators würd da z.B. auf die Barrikaden gehen.



  • [EDIT] Mir is jetzt erst aufgefallen, dass du zwei verschiedene Listen benutzt 🙄



  • [Edit] Da Michael E. editiert hat, jetzt überflüssig 🙂



  • Schneller :p 🤡

    [Edit] Och, da der Post schon mal hier ist und jetzt genauso überflüssig wie deiner ist... Wie is denn das Wetter so? 😮 🤡



  • Noch gut. Aber gleich muss ich mit'm Fahrrad nach Haus. Werd mal das Beste hoffen 🤡 😃



  • 7H3 N4C3R schrieb:

    Noch gut. Aber gleich muss ich mit'm Fahrrad nach Haus. Werd mal das Beste hoffen 🤡 😃

    Tja ich bin schon daheim (mit Fahrrad)

    Das Thema hat sich ja wohl geklärt 😉

    Gruß



  • Hab mal kurz nen Blick in die Header geworfen und es funktioniert deshalb, weil diese Memberfunktionen die Werte aus den Iteratoren extrahieren, dadurch wird die Änderung innerhalb von erase an list vorgenommen, die Größenänderung jedoch an dummy, da erase ja nen gültigen Iterator erwartet.


Anmelden zum Antworten