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>
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>
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!