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