Heim > Backend-Entwicklung > C++ > Wie entferne ich Elemente während der Iteration sicher aus einer std::list?

Wie entferne ich Elemente während der Iteration sicher aus einer std::list?

DDD
Freigeben: 2024-12-18 22:59:12
Original
387 Leute haben es durchsucht

How to Safely Remove Elements from a std::list While Iterating?

Elemente während der Iteration sicher aus einer std::list entfernen

Problem

Bedenken Sie den folgenden Code:

for (std::list<item*>::iterator i = items.begin(); i != items.end(); i++)
{
    bool isActive = (*i)->update();
    // if (!isActive) items.remove(*i);
    // else other_code_involving(*i);
}
items.remove_if(CheckItemNotActive);
Nach dem Login kopieren

Das Ziel besteht darin, inaktive Elemente sofort nach der Aktualisierung aus der Liste zu entfernen, sodass kein zweiter Durchgang erforderlich ist. Der Versuch, Elemente innerhalb der Schleife mithilfe der auskommentierten Zeilen zu entfernen, führt jedoch zum Fehler „Listeniterator nicht inkrementierbar“.

Lösung

Der Schlüssel zum sicheren Entfernen von Elementen während der Iteration liegt im Befolgen der richtige Reihenfolge der Arbeitsschritte. Anstelle des oben gezeigten For-Schleifen-Ansatzes sollte der Code wie unten gezeigt in eine While-Schleife geändert werden:

std::list<item*>::iterator i = items.begin();
while (i != items.end())
{
    bool isActive = (*i)->update();
    if (!isActive)
    {
        items.erase(i++);  // alternatively, i = items.erase(i);
    }
    else
    {
        other_code_involving(*i);
        ++i;
    }
}
Nach dem Login kopieren

Durch das erste Inkrementieren des Iterators (i) bleibt der Iterator gültig und kann zum Entfernen verwendet werden das inaktive Element.

Erklärung

In der ursprünglichen for-Schleife wird versucht, ein Element mit items.remove(*i) innerhalb der zu entfernen Der Schleifenkörper machte den Iterator (i) ungültig, was dazu führte, dass die nachfolgende Iteration fehlschlug. Die while-Schleife stellt sicher, dass der Iterator aktualisiert wird, bevor das Element entfernt wird, und stellt so seine Gültigkeit für die folgende Iteration sicher. Durch die Verwendung von items.erase(i) oder i = items.erase(i) wird das entsprechende Element aus der Liste entfernt und der Iterator wird automatisch aktualisiert, um auf das nächste gültige Element zu zeigen.

Dieser Ansatz ermöglicht für die effiziente Entfernung inaktiver Elemente während der Iteration, ohne dass ein separater Durchlauf durch die Liste erforderlich ist.

Das obige ist der detaillierte Inhalt vonWie entferne ich Elemente während der Iteration sicher aus einer std::list?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage