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

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

Barbara Streisand
Barbara StreisandOriginal
2024-12-09 13:52:14314Durchsuche

How Can I Safely Remove Elements from a C   Map During Iteration?

Elemente aus einer Karte während der Iteration entfernen

In C kann das Iterieren über eine Standardbibliothekskarte beim Entfernen von Elementen eine Herausforderung sein, da das Löschen verwendet wird () macht Iteratoren ungültig. Es gibt jedoch eine weithin akzeptierte Redewendung, um dieses Problem anzugehen:

for(auto it = m.begin(); it != m.cend() /* not hoisted */; /* no increment */)
{
  if(must_delete)
  {
    auto next = it;
    it = m.erase(it);      // or "it = m.erase(it)" since C++11
  }
  else
  {
    ++it;
  }
}

So funktioniert diese Redewendung:

  • Kein Heben:Wir heben nicht der Inkrementoperator außerhalb der Schleifenbedingung. Dies ist von entscheidender Bedeutung, da das Hochziehen dazu führen würde, dass der Iterator weiterläuft, selbst wenn das Element entfernt wird, was möglicherweise zu undefiniertem Verhalten führen würde.
  • Sicheres Inkrementieren: Innerhalb der Schleife wird der Inkrementoperator nur angewendet nachdem überprüft wurde, ob das Element nicht entfernt werden sollte.
  • Zwischenspeichern des nächsten Iterators (C 11 oder höher):Wenn ein Wenn ein Element entfernt wird, wird der Iterator vor dem Löschen im nächsten Element zwischengespeichert. Dadurch können wir die Iteration nahtlos fortsetzen, ohne die Iteratorsequenz zu unterbrechen.

Syntax vor C 11:

Vor C 11 erforderte das Löschen von Const-Iteratoren einen geringfügigen Zeitaufwand andere Syntax:

for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }

Konstanz und Entfernung:

Das Löschen eines Elements aus einer Karte verletzt nicht die Konstanz der Elemente, ähnlich wie das Löschen eines Zeigers auf eine Konstante. Konstanz schränkt in erster Linie die Möglichkeit ein, den Wert zu ändern, nicht seine Lebensdauer.

Das obige ist der detaillierte Inhalt vonWie kann ich während der Iteration sicher Elemente aus einer C-Map entfernen?. 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