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);
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“.
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; } }
Durch das erste Inkrementieren des Iterators (i) bleibt der Iterator gültig und kann zum Entfernen verwendet werden das inaktive Element.
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!