Iteration über map: Assert
-
Hallo,
ich iteriere in meinem Programm folgendermaßen über eine map:
std::map<Object*, std::set<uint>> mObjects; for(auto it = mObjects.begin(); it != mObjects.end(); ++it) { Object* obj = it->first; auto it2 = mObjects.find(obj); mObjects.erase(it2); }Diese Schleife schmiert bei mir mit einer Assertion irgendwo in map ab. Ich weiß das der Code sinnfrei ist - ich will aus Lernzwecken nur verstehen WIESO dieser Code abstürzt. Ich versteh es nicht ganz, weil ich dachte erase() invalidiert bei map oder set NICHT die Iteratoren?
Kann mir das jemand erklären?

-
Es invalidiert zumindest Iteratoren auf das gelöschte Objekt, soviel sollte auch ohne Standard-Wälzen klar sein. Dein ++it geht also in die Hose, weil logischerweise immer it==it2 gilt.
-
Bei assoziativen Containern besteht der Trick darin, mit
map.erase(itr++)eine Lösch-Iteration durchzuführen. Die anderen Iteratoren bleiben ja valid, und
itrist zum Zeitpunkt des Löschens schon beim nächsten Element.++itrauch bei Nicht-Löschen nicht vergessen!
-
Warum hat man
map::erasenicht aehnlichlist::erasegestalltet?
-
Sieht aus wie ein Designfehler.
Defect Report #130