Heim > Backend-Entwicklung > C++ > Wie entferne ich beim Iterieren in C 11 sicher Elemente aus einem Vektor?

Wie entferne ich beim Iterieren in C 11 sicher Elemente aus einem Vektor?

Mary-Kate Olsen
Freigeben: 2024-11-28 20:56:11
Original
391 Leute haben es durchsucht

How to Safely Remove Elements from a Vector While Iterating in C  11?

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
    // ...
}
Nach dem Login kopieren

Innerhalb der Schleife erkennen Sie, dass Sie ein bestimmtes Element aus dem Vektor inv entfernen müssen. Es treten jedoch zwei Probleme auf:

  1. Element kann nicht entfernt werden: Die bereichsbasierte for-Schleife bietet keine Möglichkeit, den Vektor zu ändern, während darüber iteriert wird.
  2. Schleifengültigkeit: Das Entfernen eines Elements aus einem Vektor kann möglicherweise ungültig werden Schleife.

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;
    }
}
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage