Heim >Backend-Entwicklung >C++ >Warum stürzt das Löschen von Vektorelementen mit einem Iterator ohne eine spezifische Bedingungsprüfung ab?

Warum stürzt das Löschen von Vektorelementen mit einem Iterator ohne eine spezifische Bedingungsprüfung ab?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-07 12:25:131053Durchsuche

Why Does Erasing Vector Elements with an Iterator Crash Without a Specific Conditional Check?

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!

Stellungnahme:
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