prä oder postinkrementieren/dekrementieren in schleifen?
-
@TGGC|_work
Im C++ Standard findest du unter 23.3.1 "Template class map" im Abschnitt "modifiers" genau drei erase-Funktionen.void erase(iterator pos); size_type erase(const key_type& x); void erase(iterator first, iterator last)Und der Standard ist nun mal das Dokument, dass im *Standard*-C++ Forum die größte Relevanz hat. Weleche Doku hat dir denn was falsches suggeriert?
-
Redhead schrieb:
Wenns "einfach" sein soll, was spricht gegen die Verwendung von remove() mit anschliessendem erase() ??
Was meinst du? Meinst du das "erase-remove-idiom"? Falls ja, das funktioniert nicht bei assoziativen Containern.
-
HumeSikkins schrieb:
Und der Standard ist nun mal das Dokument, dass im *Standard*-C++ Forum die größte Relevanz hat.
Stimmt, die Realität sollte man ignorieren, es gibt nur eine Wahrheit...

Bye, TGGC (Demo or Die)
-
TGGC|_work schrieb:
HumeSikkins schrieb:
Und der Standard ist nun mal das Dokument, dass im *Standard*-C++ Forum die größte Relevanz hat.
Stimmt, die Realität sollte man ignorieren, es gibt nur eine Wahrheit...

Nö. Nur sollte man schon prüfen, was Realität ist.
Schauen wir mal:
Gnu-STL, STL-Port, SGI-STL, comolib: void erase
Dinkumware-STL: iterator erase.Fazit: Wer ausschließlich mit dem Visual Studio arbeitet oder aber überall eine Dinkumware-STL installiert (erst kaufen), der kann auf einen Rückgabwert vom Typ iterator bauen.
Wer allerdings nebenbei mit einem gcc, einem sun-cc oder irgendeinem anderen Compiler arbeitet, der sollte in diesem Punkt wohl besser beim Standard bleiben.
-
HumeSikkins ist das hier ok?
for(MapIterator itr = c.begin(); itr != c.end(); ++itr) { if(itr->second == "bla") { c.erase(itr); } }
-
... schrieb:
HumeSikkins ist das hier ok?
for(MapIterator itr = c.begin(); itr != c.end(); ++itr) { if(itr->second == "bla") { c.erase(itr); } }Nein. Durch die erase-Operation wird der Iterator ungültig. Der nachfolgende Aufruf des Inkrement-Operators führt dann zu undefiniertem Verhalten.
-
Ich bin zwar nicht HumeSikkins, aber trotzdem: nein. c.erase(it) zerlegt den übergebenen Iterator, danach dürfte er nicht mehr auf ein gültiges Element des Containers zeigen - und danach brauchst du viel Glück (und eine stabil implementierte Bibliothek), um noch sinnvoll mit it weiterarbeiten zu können.
Du mußt deinen Zähl-Iterator also schon weitergerechnet haben, bevor du eine Kopie davon an c.erase() übergeben kannst - und das schaffst du z.B. mit effe_eichelt's Code.
-
Ah
Endlich hab ichs gerafft. Danke. 
-
TGGC schrieb:
Bitte.
Bye, TGGC (Demo or Die)
-
