Heim > Backend-Entwicklung > C++ > Hauptteil

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

Barbara Streisand
Freigeben: 2024-10-25 10:43:30
Original
574 Leute haben es durchsucht

## 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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!