iterator nach erase weiter verwenden...?
-
Hallo!
Ich habe das oben angegebene Code-Fragment in mein Programm eingebaut und getestet und ... es funktioniert ...
Danke also allen Beteiligten für Ihre Unterstützung!
-
ssm schrieb:
ich zweifle, dass du auch weißt, wie postincrement funktioniert
Mir, und ich bin sicher auch Shade, ist bekannt wie post-increment funktioniert. Ich denke mal du hast einen Denkfehler: Du rufst erase mit dem Iterator auf. Der ist jetzt ungültig, weil die stl das so sagt. Das er vielleicht trotzdem auf das Erwartete Element zeigt und nicht auf Datenmüll, ist Implementationsabhängig. Nun wird der Iterator inkrementiert. Das ändert aber nicht s daran, dass er ungültig ist (Wenn du einen ungültigen ointer inkrementierst wird er dadurch nicht gültiger...).
-
Der Iterator wird doch erst inkrementiert und dann der alte Iterator gelöscht.
-
Ja. Aber bei einer Löschaktion werden _alle_ Iteratoren ungültig.
-
Dann sieht es ja fast so aus, als wenn man sowas nicht bei einem set machen sollte. Ich meine dann gibt es ja keine vernünftige Technik um das zu realisieren?!
-
Was sit daran unvernünftig den Iterator einfach auf den Anfang zu setzen? Außerdem trifft das auf alle stl-container zu...
-
Ah, so geht das. Die meisten Container geben ja bei erase auch einen gültigen Iterator zurück. Ich verstehe aber einfach nicht warum das nicht alle Container machen.
-
Bearbeitet man dann nicht Elemente doppelt?
-
Das ist tatsächlich merkwürdig...
-
Eventuell kann man mit std::remove_if was machen
-
ness schrieb:
Ja. Aber bei einer Löschaktion werden _alle_ Iteratoren ungültig.
So ein Käse. RTFM. Der Code von ssm ist für eine std::set (und jeden anderen assoziativen STL-Container) absolut korrekt und steht genauso in jedem guten Anfängerbuch. Siehe z.B. Scott Meyers "Effective STL - Item 9".
Bitte nicht einfach irgendwas behaupten und dann hoffen, dass wir den Schwachfug nicht bemerken.
-
Haha, Shade und ness wissen nicht wie post-increment funktioniert!
-
Honk XP schrieb:
Haha, Shade und ness wissen nicht wie post-increment funktioniert!
Es geht hier weniger um die Wirkunsweise von Post-Increment (die kennt Shade sogar im Schlaf) sondern vielmehr um die Iterator/Referenz-Invalidierungseigenschaften der STL-Container sowie um die Signaturen der einzelnen erase-Methoden.
-
Tschuldigung, hatte noch den thread: http://www.c-plusplus.net/forum/viewtopic.php?t=92015&highlight=ung�ltig im Kopf. Aber der bezog sich ja auf einen std::vector...