Vector Erase Iterator: Die Fallstricke verstehen
Bei der Arbeit mit Vektoren ist es wichtig, den Erase Iterator richtig zu verwenden, um unerwartetes Verhalten zu vermeiden. In diesem Artikel untersuchen wir eine häufige Gefahr im Zusammenhang mit dem Löschen von Elementen mit einer Schleife.
Betrachten Sie den folgenden Code:
int main() { vector<int> res; res.push_back(1); vector<int>::iterator it = res.begin(); for ( ; it != res.end(); it++) { it = res.erase(it); //if (it == res.end()) // return 0; } }
Der Dokumentation zufolge „zeigt der Erase-Iterator auf die neue Position des Elements, das auf das letzte durch den Funktionsaufruf gelöschte Element folgte.“ Dies bedeutet, dass das Löschen des letzten Elements in der Sequenz dazu führt, dass der Iterator auf das Ende des Vektors zeigt.
Wenn wir diesen Code jedoch ausführen, ohne zu prüfen, ob er == res.end() ist, wird das Programm stürzt ab. Warum ist das so?
Die Inkrementfalle
Der Schlüssel zum Verständnis dieses Verhaltens liegt in der Funktionsweise der for-Schleife. Nach jeder Iteration der Schleife wird der Iterator automatisch inkrementiert. Das heißt, wenn das letzte Element gelöscht wird, zeigt der Iterator auf das Ende des Vektors, was kein gültiger Ort zum Inkrementieren ist.
Durch Hinzufügen von if (it == res.end()) 0 zurückgeben; prüfen, behandeln wir den Fall, in dem das letzte Element gelöscht wird und der Iterator auf das Ende zeigt. Dadurch wird verhindert, dass der Inkrementierungsvorgang einen Absturz verursacht.
Ein effizienterer Ansatz
Während der obige Ansatz funktioniert, gibt es einen effizienteren Weg, alle Elemente aus einem Vektor zu löschen . Anstatt den Vektor zu durchlaufen und jedes Element einzeln zu löschen, löscht ein einfacher Aufruf von res.clear() den gesamten Vektor, ohne dass eine Schleife erforderlich ist.
Bedingtes Löschen
Allerdings Wenn Sie nur bestimmte Elemente basierend auf einer Bedingung löschen müssen, können Sie das folgende Muster verwenden:
for ( ; it != res.end(); ) { if (condition) { it = res.erase(it); } else { ++it; } }
Dieser Ansatz ermöglicht es Ihnen Durchlaufen Sie den Vektor, prüfen Sie jedes Element auf eine Bedingung und löschen Sie es nur, wenn die Bedingung erfüllt ist.
Das obige ist der detaillierte Inhalt vonWarum führt das Löschen von Vektorelementen in einer Schleife zu einem Absturz und wie kann ich das vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!