Iterative Entfernung aus Karten: Iteratoren beibehalten
Bei der Karteniteration kann das Entfernen von Elementen ein kniffliger Vorgang sein, da es Iteratoren ungültig machen kann. Um dies zu verhindern, suchen Programmierer oft nach Lösungen, die die Gültigkeit des Iterators bewahren.
Die Standardlösung für dieses Problem ist das Assoziativ-Container-Erase-Idiom:
for (auto it = m.cbegin(); it != m.cend() /* not hoisted */; /* no increment */) { if (must_delete) { m.erase(it++); // or "it = m.erase(it)" since C++11 } else { ++it; } }
Entscheidend ist, dass eine reguläre for-Schleife vorhanden ist wird hier anstelle einer bereichsbasierten For-Schleife (RBFL) verwendet, da der Container geändert wird. In einer gewöhnlichen for-Schleife wird der Iterator explizit inkrementiert und ermöglicht so die Kontrolle über den Iterationsprozess. RBFLs, die automatisch über Elemente iterieren, verbergen den Iterationsmechanismus und könnten zu undefiniertem Verhalten führen.
Für Implementierungen vor C 11 ist die Syntax etwas anders:
for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }
Hier const Iteratoren können nicht gelöscht werden. Daher muss ein dedizierter Iterator verwendet werden, der das Löschen ermöglicht.
Das obige ist der detaillierte Inhalt vonWie kann ich Elemente sicher aus einer C-Map entfernen und gleichzeitig die Gültigkeit des Iterators bewahren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!