Heim  >  Artikel  >  Backend-Entwicklung  >  ## Sind alle Iteratoren nach „erase“ auf einem „std::vector“ ungültig?

## Sind alle Iteratoren nach „erase“ auf einem „std::vector“ ungültig?

Barbara Streisand
Barbara StreisandOriginal
2024-10-25 10:43:30575Durchsuche

## Are All Iterators Invalid After `erase` on a `std::vector`?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn