Warum stürzt der „Vector Erase Iterator“-Code ohne eine zusätzliche Bedingungsprüfung ab?
Bedenken Sie den folgenden Code:
vector<int> res; res.push_back(1); vector<int>::iterator it = res.begin(); for( ; it != res.end(); it++) { it = res.erase(it); }
Dieser Code versucht, mithilfe eines Iterators alle Elemente aus einem Vektor zu löschen. Es stürzt jedoch ohne die folgende zusätzliche bedingte Prüfung ab:
if(it == res.end()) return 0;
Erläuterung
Die Erase-Funktion gibt einen Iterator zurück, der auf das nächste Element nach dem gelöschten Element zeigt. Wenn das letzte Element gelöscht wird, ist der zurückgegebene Iterator gleich res.end().
Im Originalcode ohne die bedingte Prüfung erhöht die for-Schleife den Iterator auch nach Erreichen des Endes weiter Vektor. Dies führt zu einem Versuch, über die Grenzen des Vektors hinaus auf den Speicher zuzugreifen, was zu einem Absturz führt.
Durch die Verwendung der bedingten Prüfung wird die Schleife beendet, wenn der Iterator das Ende des Vektors erreicht (es == res. Ende()). Dies verhindert den Absturz.
Alternative Schleifenstruktur
Um die Notwendigkeit der Bedingungsprüfung zu vermeiden, können Sie die Schleife wie folgt umschreiben:
while (it != res.end()) { it = res.erase(it); }
Diese Schleife wird automatisch beendet, wenn sie res.end() erreicht, da die Bedingung nicht mehr gilt wahr.
Zusätzliche Überlegungen
Beim bedingten Löschen von Elementen ist es notwendig, den Iterator manuell zu erhöhen, wenn das Element nicht gelöscht wird. Dies kann erreicht werden mit:
for ( ; it != res.end(); ) { if (condition) it = res.erase(it); else ++it; }
Das obige ist der detaillierte Inhalt vonWarum stürzt das Löschen von Vektorelementen mit einem Iterator ohne eine spezifische Bedingungsprüfung ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!