Elemente aus einer std::list iterieren und entfernen
Das Entfernen von Elementen aus einer std::list während der Iteration erfordert eine sorgfältige Handhabung Vermeiden Sie es, den Iterator ungültig zu machen. Ein häufiges Missverständnis besteht darin, anzunehmen, dass das Entfernen eines Elements unmittelbar nach seiner Auswertung den Iterator korrekt erhöht. Dieser Ansatz führt jedoch zum Fehler „Listeniterator nicht inkrementierbar“.
Grundlegendes zum Verhalten von Iteratoren
In einer std::list werden Elemente zusammenhängend zugeordnet. Wenn ein Element entfernt wird, verschieben sich die nachfolgenden Elemente, um den frei gewordenen Platz zu füllen. Dadurch wird der Iterator, der ursprünglich auf das entfernte Element zeigte, ungültig. Das Erhöhen dieses Iterators führt zu undefiniertem Verhalten.
Richtiger Ansatz: Zuerst erhöhen, später entfernen
Um Elemente während der Iteration korrekt zu entfernen, verwenden Sie die folgende Strategie:
Modifizierter Code mit einer While-Schleife:
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; } }
Dieser modifizierte Code iteriert durch die Liste und:
Vermeiden des Remove_if-Ansatzes
Ihr ursprünglicher Code enthielt einen Aufruf von „remove_if()“ nach der Schleife. Von diesem Ansatz wird in diesem Zusammenhang generell abgeraten, da er einen zusätzlichen Durchlauf der Liste erfordert. Die Iteration und Entfernung in einem Durchgang ist, wie oben gezeigt, eine effizientere und einfachere Lösung.
Das obige ist der detaillierte Inhalt vonWie kann ich Elemente sicher aus einer std::list iterieren und entfernen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!