Heim >Backend-Entwicklung >C++ >Wie entferne ich während der Iteration sicher Elemente aus einer C-Map?

Wie entferne ich während der Iteration sicher Elemente aus einer C-Map?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-12 15:20:11641Durchsuche

How to Safely Remove Elements from a C   Map During Iteration?

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!

Stellungnahme:
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