Heim >Backend-Entwicklung >C++ >## Sind alle Iteratoren nach „erase' auf einem „std::vector' ungültig?
std::vector Iterator-Invalidierung: Alle Iteratoren nach dem Löschen ungültig machen
Es ist allgemein bekannt, dass das Löschen eines Elements aus einem Vektor nur das Zeigen von Iteratoren ungültig macht auf Positionen nach dem gelöschten Element. Es stellt sich jedoch eine zentrale Frage: Ist der Iterator an der gelöschten Position noch gültig?
Gemäß dem C-Standard lautet die Antwort „Nein“. Alle Iteratoren bei oder nach den zum Löschen übergebenen Iteratoren werden ungültig. Dies impliziert, dass der folgende Code, der darauf abzielt, ungerade Ganzzahlen aus einem Vektor zu entfernen, zu undefiniertem Verhalten führt:
<code class="cpp">typedef std::vector<int> vectype; vectype vec; // Initialize the vector for (int i = 0; i < 100; ++i) vec.push_back(i); vectype::iterator it = vec.begin(); while (it != vec.end()) { if (*it % 2 == 1) vec.erase(it); // Invalidating iterator else ++it; }</code>
Iteration richtig behandeln
Iteration behandeln Verwenden Sie nach dem Löschen den vom Löschen zurückgegebenen Iterator korrekt. Dieser Iterator zeigt auf das Element unmittelbar nach dem/den gelöschten Element(en) (oder auf das Ende, wenn es keines gibt).
In diesem Fall wäre ein effizienterer Ansatz zum Entfernen ungerader Ganzzahlen die Verwendung der Löschfunktion. Idiom entfernen:
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; } vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
Das obige ist der detaillierte Inhalt von## Sind alle Iteratoren nach „erase' auf einem „std::vector' ungültig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!