Heim > Backend-Entwicklung > C++ > ## **Zeigen von „std::vector::erase' zurückgegebene Iteratoren nach dem Entfernen auf gültige Elemente?**

## **Zeigen von „std::vector::erase' zurückgegebene Iteratoren nach dem Entfernen auf gültige Elemente?**

Barbara Streisand
Freigeben: 2024-10-25 13:11:30
Original
374 Leute haben es durchsucht

## **Do `std::vector::erase`-returned iterators Point to Valid Elements After Removal?**

Ungültigmachung von std::vector-Iteratoren: Eine detaillierte Erklärung

Das Konzept der Iterator-Ungültigmachung in std::vector wurde häufig diskutiert. Zur Verdeutlichung: Das Löschen von Vektorelementen über std::vector::erase macht Iteratoren ungültig, die genau nach dem gelöschten Element positioniert sind.

Die Gültigkeit des Iterators an der genauen Position des gelöschten Elements bleibt jedoch ungewiss. Logischerweise könnte man annehmen, dass dieser Iterator gültig bleibt, da die zugrunde liegende Implementierung des Vektors normalerweise verbleibende Elemente verschiebt, um den leeren Raum zu füllen. Das genaue Verhalten und die Möglichkeit undefinierter Ergebnisse sind jedoch weniger sicher.

Betrachten Sie das folgende Beispiel, das die Entfernung ungerader Ganzzahlen aus einem Vektor veranschaulicht:

<code class="cpp">typedef std::vector<int> vectype;
vectype vec;

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);
    else ++it;
}</code>
Nach dem Login kopieren

Während dieser Code so aussieht Wenn es in der Praxis fehlerfrei ausgeführt wird, bleibt seine Gültigkeit umstritten.

Die Antwort liegt im Verhalten von Erase: Es macht tatsächlich alle Iteratoren ungültig, wenn oder nachdem die Iteratoren an Erase übergeben wurden. Es gibt jedoch auch einen neuen Iterator zurück, und zwar unmittelbar nach dem/den gelöschten Element(en) oder bis zum Ende, wenn ein solches Element nicht existiert. Dieser Iterator kann verwendet werden, um die Iteration fortzusetzen.

Es ist wichtig zu beachten, dass die obige Methode zum Entfernen ungerader Ganzzahlen ineffizient ist (O(n2)), da jede Löschung eine Verschiebung aller erfordert nachfolgende Elemente. Das Erase-Remove-Idiom bietet eine weitaus effizientere Lösung (O(n)):

<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## **Zeigen von „std::vector::erase' zurückgegebene Iteratoren nach dem Entfernen auf gültige Elemente?**. 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