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

Wie lösche ich Elemente während der Iteration sicher aus einer std::list?

Barbara Streisand
Barbara StreisandOriginal
2024-12-21 04:25:11421Durchsuche

How to Safely Delete Elements from a std::list During Iteration?

Elemente während der Iteration in einer std::list löschen

Beim Durchlaufen einer std::list kann das Entfernen von Elementen unter Beibehaltung eines gültigen Iterators eine Herausforderung sein. Betrachten 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);

Das Hinzufügen der auskommentierten Zeilen zum sofortigen Entfernen inaktiver Elemente würde zu einem Fehler „Listeniterator nicht inkrementierbar“ führen. Dies liegt daran, dass das Entfernen eines Elements den Iterator ungültig macht.

Vermeiden mehrerer Durchgänge

Um Elemente während der Iteration effizient zu entfernen, sollten Sie einen While-Schleifen-Ansatz in Betracht ziehen:

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;
    }
}

Der Schlüssel hier besteht darin, den Iterator zu erhöhen, bevor das Element entfernt wird. Alternativ kann „i = items.erase(i)“ verwendet werden. Dies ermöglicht das sichere und effiziente Entfernen von Elementen während der Iteration.

Das obige ist der detaillierte Inhalt vonWie lösche 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!

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