Frage zur Gültigkeit von Iteratoren bei .erase()
-
Hallo, ich habe eine Multimap, in der ich folgende Aktion durchführe
std::multimap<std::string, char> container; //container füllen std::multimap<std::string, char>::iterator it = container.begin(), et = container.end(); for( ; it != et ; ++it) { if(/*irgend eine bedingung*/) { container.erase(it); et=container.end(); } }Nach dem erase() Vorgang wird der end-iterator natürlich ungültig, da die containergröße um eins abgenommen hat. erase gibt ja einen iterator zurück, der auf ein Element hinter dem gelöschten zeigt. Ist der alte Iterator dann noch gültig? Wenn ich den neuen Iterator als "it" verwenden würde, würde ja ein Element übersprungen, da "it" ja sofort um eins erhöht wird. Stimmt also der code oben?
Oder ist es üblicher so ein Problem auf folgende Weise zu lösen?while(it!=et) { if(/*irgend eine bedingung*/) { it=container.erase(it); et=container.end(); } else ++it; }Oder liege ich hier ganz falsch

-
Gültigkeit schrieb:
Oder ist es üblicher so ein Problem auf folgende Weise zu lösen?
while(it!=et) { if(/*irgend eine bedingung*/) { it=container.erase(it); et=container.end(); } else ++it; }Oder liege ich hier ganz falsch

Nicht ganz, das
et=container.end();kannst Du Dir allerdings sparen.
-
Überprüfe doch einfach bei jedem Schleifendurchlaufe auf
for( ; it != container.end(); ++it)Dann hast du das Problem mit dem ungültig werden von iteratoren nicht.
-
blub² schrieb:
Überprüfe doch einfach bei jedem Schleifendurchlaufe auf
for( ; it != container.end(); ++it)Dann hast du das Problem mit dem ungültig werden von iteratoren nicht.
Dann hat er jeden Schleifendruchlauf nen völlig sinnlosen Fkt-Aufruf dabei...
Bei der map sollte das = end() nciht nötig sein, nachdem gelöscht wurde - bei ner liste auch nicht - nur bei nem vector und ner deque wird es nötig - da man den code aber nicht jedes mal ändern möchte, würde ich einfach sagen:
Nimm std::remove_ifbb
-
unskilled schrieb:
Bei der map sollte das = end() nciht nötig sein, nachdem gelöscht wurde
Doch. Binärbäume können sich intern umorganisieren, nachdem ein Objekt gelöscht worden ist.