std::list und erase
-
hallo!
ich hab bis vor kurzem noch mit vc6 rumhantiert, da ging folgender code:
std::list<int> objs; // füllen... typedef ListIt std::list<int>::iterator; /7 oder andersrum? kanns mir nie merken :-) for(ListIt it = objs.begin(); it != obj.end(); it++) { if(//Bedingung mit it-> ... ) { // soll gelöscht werden ListIt tmp = it; tmp++; obj.erase(it); it = tmp; } }
Nun allerdings gibt er mir manchmal, die Assert-Meldung aus, seitdem ich mit vc8 arbeite:
iterator not incrementablewie löscht man denn nun richtig Elemente aus einer Liste?
-
Hallo,
Woraus die Fehlermeldung resultiert, weiß ich nicht. Aber warum schreibst du nicht statt// soll gelöscht werden ListIt tmp = it; tmp++; obj.erase(it); it = tmp;
ListIt next_element = obj.erase(it);
??
Btw: Das mit dem typedef ist genau umgekehrt
Gruß Caipi
-
Caipi schrieb:
Btw: Das mit dem typedef ist genau umgekehrt
Irgendwo ja auch logisch:
// Ein std::list<int>::iterator nennt sich auch ListIt typedef std::list<int>::iterator ListIt;
und nicht:
// Ein ListIt sich auch std::list<int>::iterator nennt typedef ListIt std::list<int>::iterator;
Kein Yoda-Speak in C++
MfG SideWinder
-
Maxi schrieb:
wie löscht man denn nun richtig Elemente aus einer Liste?
Hallo Maxi,
so richtig geht's mit der list-Methode remove_if, das wurde aber vom VC6 nur bedingt unterstützt, da es sich um ein Template handelt.
int arr[] = { 2, 3, 5, 3, 9 }; list< int > l( arr, arr + sizeof( arr )/sizeof( *arr ) ); l.remove_if( bind2nd( equal_to< int >(), 3 ) ); // alle 3'en entfernen; benötigt #include <functional>
Gruß
Werner