Ich habe Code bekam die wie folgt aussieht:Können Sie Elemente aus einer std :: list entfernen, während Sie sie durchlaufen?
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);
Ich mag inaktive Elemente, um sie aktualisieren unmittelbar nach entfernen würde, inorder um die Liste zu vermeiden, wieder zu Fuß. Aber wenn ich die auskommentierten Zeilen hinzufüge, erhalte ich einen Fehler, wenn ich zu i++
komme: "Liste Iterator nicht inkrementierbar". Ich habe einige Alternativen versucht, die in der for-Anweisung nicht erhöht wurden, aber ich konnte nichts zum arbeiten bekommen.
Was ist der beste Weg, um Elemente zu entfernen, während Sie eine std :: list laufen?
perfekt, arbeitete wie ein Charme. – AShelly
Das funktioniert nicht garantiert. Mit "Erase (i ++);" wissen wir nur, dass der vorinkrementierte Wert an Erase() übergeben wird und das i vor dem Semikolon erhöht wird, nicht unbedingt vor dem Aufruf von Erase(). Iterator prev = i ++; Löschen (prev); ist sicher zu arbeiten, wie ist der Rückgabewert –
Nein James, ich wird inkrementiert vor dem Aufruf löschen, und der vorherige Wert wird an die Funktion übergeben. Die Argumente einer Funktion müssen vor dem Aufruf der Funktion vollständig ausgewertet werden. –