Map Element löschen während man iteriert
-
Hallo!
ist folgendes gültig?
map<int, Foo> >::iterator it = mymap.begin(); while(it != mymap.end()) { if(bedingung) { zahl = ... mymap.erase(zahl); } ++it; }
Ich will über mymap iterieren und wenn eine gewisse Bedigung erfüllt ist, per Key löschen. Kann ich danach einfach ++it aufrufen?
-
Der iterator wird invalidiert, ++ danach ist ungültig.
Siehe
http://en.cppreference.com/w/cpp/container/map/erase
http://stackoverflow.com/questions/263945/what-happens-if-you-call-erase-on-a-map-element-while-iterating-from-begin-to
-
Wenn du eine unordered_map nimmst könntest du (vermutlich) die unordered_map partitionieren (siehe <algorithm>) und dann die range in einem rutsch löschen.
habe das mit einer unordered map aber noch nie gemacht.
-
-
map<int, Foo> >::iterator it = mymap.begin(); while(it != mymap.end()) { bool increment=true; if(bedingung) { zahl = ... auto deleteme = mymap.find(zahl); if (deleteme==it) { it=mypap.erase(it); increment=false; } else { mymap.erase(deleteme); } } if (increment) ++it; }
-
Danke gütigkeit!
Leider liefert bei mir die Zeile
it=mypap.erase(it);
einen Fehler. Offenbar geht das erst seit C++11, das ich nicht benutzen kann:(
-
Martin2 schrieb:
Offenbar geht das erst seit C++11
Ich tippe eher auf einen blöden Schreibfehler. Schwer zu sagen, da du schlau genug warst, die Fehlermeldung für dich zu behalten.
-
MFK schrieb:
Martin2 schrieb:
Offenbar geht das erst seit C++11
Ich tippe eher auf einen blöden Schreibfehler. Schwer zu sagen, da du schlau genug warst, die Fehlermeldung für dich zu behalten.
Also ich sehe da keine Ueberladung mit Iterator als Rueckgabewert...
-
Dann ersetze
it=mypap.erase(it);
durch
++it; mypap.erase(deleteme);