Heim >Backend-Entwicklung >C++ >Wie entferne ich während der Iteration sicher Elemente aus einer C-Map?
Elemente aus einer Karte während der Iteration entfernen
Beim Durchlaufen einer Karte besteht der übliche Ansatz darin, eine bereichsbasierte for-Schleife zu verwenden. Das Ändern der Karte während der Iteration kann jedoch zu unerwartetem Verhalten führen, da die Iteratoren ungültig werden.
Die empfohlene Technik zum Entfernen von Elementen aus einer Karte während der Iteration wird als „Assoziativ-Container-Erase-Idiom“ bezeichnet:
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; } }
Diese Redewendung stellt mithilfe des Präfixinkrements sicher, dass der Iterator gültig bleibt, nachdem das Element entfernt wurde Operator.
Beachten Sie, dass es in diesem Fall wichtig ist, eine herkömmliche for-Schleife anstelle einer bereichsbasierten for-Schleife zu verwenden, da eine Änderung des Containers die Iteratoren der bereichsbasierten Schleife ungültig macht.
Vor C 11 war es notwendig, beim Durchlaufen einer Karte einen separaten Iteratortyp zu verwenden, um Elemente zu entfernen:
for (std::map<K, V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }
In beiden Fällen Das Löschen eines Elements verletzt nicht die Konstanz des Elements, da die Konstanz in C keinen Einfluss auf die Lebensdauer eines Objekts hat.
Das obige ist der detaillierte Inhalt vonWie entferne ich während der Iteration sicher Elemente aus einer C-Map?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!