Entfernen von Elementen aus Vektoren während bereichsbasierter C 11-Schleifen
Bereichsbasierte for-Schleifen in C 11 bieten eine bequeme Möglichkeit zum Durchlaufen die Elemente eines Containers, insbesondere wenn Sie Aktionen für jedes Element ausführen müssen. Wenn Sie jedoch mit Vektoren arbeiten, müssen Sie möglicherweise manchmal Elemente aus dem Vektor entfernen, während Sie darüber iterieren.
Problem
Bedenken Sie den folgenden Code:
std::vector<IInventory*> inv; inv.push_back(new Foo()); inv.push_back(new Bar()); for (IInventory* index : inv) { // Do some stuff // ... }
Innerhalb der Schleife erkennen Sie, dass Sie ein bestimmtes Element aus dem Vektor inv entfernen müssen. Es treten jedoch zwei Probleme auf:
Lösung
Bereichsbasierte for-Schleifen sind für Situationen gedacht, in denen Sie nur einmal auf jedes Element des Containers zugreifen müssen. Wenn Sie während der Iteration Elemente ändern oder entfernen müssen, sollten Sie eine herkömmliche for-Schleife oder eine ihrer Iterator-basierten Varianten verwenden.
So können Sie den Code mithilfe einer herkömmlichen for-Schleife mit Iterator-Inkrementverwaltung ändern:
for (auto i = inv.begin(); i != inv.end(); /*++i*/) { // Do stuff if (should_remove) { i = inv.erase(i); } else { ++i; } }
Durch die explizite Verwaltung des Iteratorinkrements behalten Sie die Gültigkeit der Schleife bei und stellen sicher, dass Sie Elemente entfernen und ändern können, ohne auf welche zu stoßen Fehler.
Das obige ist der detaillierte Inhalt vonWie entferne ich beim Iterieren in C 11 sicher Elemente aus einem Vektor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!