Heim  >  Artikel  >  Backend-Entwicklung  >  Wie entferne ich Elemente während der Iteration sicher aus einem std::vector?

Wie entferne ich Elemente während der Iteration sicher aus einem std::vector?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-30 07:35:02337Durchsuche

How to Safely Remove Elements from a std::vector During Iteration?

Elemente aus einem std::Vector während der Iteration entfernen

Wenn Sie einen Vektor mit Elementen haben und Elemente entfernen müssen, während Sie ihn durchlaufen , kann die Methode erase() zu Schwierigkeiten führen. Durch das Löschen eines Elements werden alle Iteratoren ungültig, die auf nachfolgende Elemente verweisen.

Iteratoren und erase()

Bedenken Sie den folgenden Code:

<code class="cpp">std::vector<std::string> m_vPaths;
...
for (auto iter = m_vPaths.begin(); iter != m_vPaths.end(); iter++) {
  std::string strPath = *iter;
  if (::DeleteFile(strPath.c_str())) {
    m_vPaths.erase(iter);
    // Iterators become invalid after erase
  }
}</code>

Nach dem Beim ersten erfolgreichen Löschen der Datei wird der Iterator, der auf das nächste Element zeigt, ungültig. Dies erschwert die Fortsetzung der Iteration.

Verwendung von zwei Vektoren

Eine Lösung besteht darin, zwei Vektoren zu verwenden: einen zum Durchlaufen und einen anderen zum Speichern der zu löschenden Elemente . Dies funktioniert zwar, führt jedoch zu zusätzlichem Speicheraufwand und erhöhter Komplexität.

Alternative Datenstrukturen

Es gibt Datenstrukturen, die sich besser zum Entfernen von Elementen während der Iteration eignen, wie zum Beispiel:

  • std::set> (geordnet und eindeutig, natürlich in absteigender Reihenfolge sortiert)
  • std::unordered_set (ungeordnet und eindeutig)

Diese Strukturen verwalten eine sortierte oder ungeordnete Sammlung von Werten, und durch das Entfernen werden andere Elemente nicht ungültig.

Verwendung von std::remove_if

Alternativ können Sie den Algorithmus std::remove_if() verwenden, um bestimmte Elemente aus dem Vektor zu entfernen, bevor Sie sie löschen. Dadurch wird sichergestellt, dass Iteratoren gültig bleiben:

<code class="cpp">auto iter_new_end = std::remove_if(m_vPaths.begin(), m_vPaths.end(),
  [](const std::string& strPath) {
    return ::DeleteFile(strPath.c_str());
  });
m_vPaths.erase(iter_new_end, m_vPaths.end());</code>

Fazit

Abhängig von Ihren spezifischen Anforderungen können Sie den besten Ansatz auswählen aus:

  • Iteratoren mit Vorsicht verwenden
  • Zwei Vektoren beibehalten
  • Alternative Datenstrukturen verwenden
  • Std::remove_if() verwenden

Das obige ist der detaillierte Inhalt vonWie entferne ich Elemente während der Iteration sicher aus einem std::vector?. 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