2012-04-05 18 views
9

Ist es erlaubt, ein Element, auf das der Iterator zeigt, zu löschen und den gleichen Iterator in einer Zeile weiterzuentwickeln, um zum nächsten Element zu gelangen?C++ set iterator removal

set<int>::iterator it = S.begin(); 
while (it != S.end()) { 
    if (shouldBeRemoved(*it)) { 
     S.erase(it++); // is this line valid? 
    } else { 
     ++it; 
    } 
} 

Antwort

5

Ist es erlaubt, ein Element von Iterator darauf zu löschen und voran die gleiche Iterator in einer Linie zur nächsten Element zu gehen?

Ja, es ist gültig.


Rationale:

it++ Inkrementen it, so dass es auf das nächste Element bezieht, sondern eine Kopie seiner ursprünglichen Wert ergibt. Daher bezieht sich it nicht auf das Element, das entfernt wird, wenn erase() aufgerufen wird. Und im Fall von std::set werden nur Iteratoren für das gelöschte Element ungültig gemacht. # 1

Sie können dieses Codebeispiel als Standardcode betrachten, um ein Element zu entfernen, auf das sich Ihr Iterator bezieht.


Referenzen:

Für std::set,
# 1C++ 03 Standard-23.1.2/8:

Nur Iteratoren und Verweise auf die gelöschten Elemente werden ungültig gemacht

2

Ja, es ist gültig. Der Ausdruck it++ wird vollständig ausgewertet, bevor die Funktion aufgerufen wird. Daher erhält die Funktion den vorherigen Wert it, aber zu dem Zeitpunkt, zu dem der Iterator entfernt (und ungültig gemacht) wird, wurde er bereits inkrementiert.