Heim >Backend-Entwicklung >C++ >Wie entferne ich Elemente während der Iteration sicher aus einem std::set?
Elemente aus std::set während der Iteration löschen
Wenn Sie eine Menge durchlaufen und auf Elemente stoßen, die basierend auf bestimmten Kriterien entfernt werden müssen , ist es wichtig, die Auswirkungen auf den Iterator zu berücksichtigen. Das Löschen eines Elements während der Iteration kann möglicherweise den Iterator ungültig machen, was zu undefiniertem Verhalten führt.
Ein häufiges Missverständnis besteht darin, dass das Löschen eines Elements aus einer Menge während der Iteration den Iterator ungültig machen und dazu führen würde, dass das Inkrement in der for-Schleife zunimmt undefiniertes Verhalten haben. Dies ist jedoch nicht unbedingt der Fall. Das Verhalten von Iteratoren beim Entfernen von Elementen hängt von der Implementierung ab und ist gemäß dem C-Standard nicht definiert.
Ein Ansatz zum sicheren Löschen von Elementen aus einer Menge während der Iteration ist die Verwendung einer alternativen Schleifenstruktur:
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { it = numbers.erase(it); } else { ++it; } }
In diesem Code wird der Iterator als Wert an die Löschoperation übergeben, die einen Iterator zurückgibt, der auf das nächste Element zeigt (oder auf das Ende der Menge, falls das letzte Element war). ENTFERNT). Dieser Ansatz entspricht dem C-Standard und stellt sicher, dass der Iterator gültig bleibt.
Eine andere, wenn auch etwas ausführlichere Option besteht darin, eine Kopie des aktuellen Iterators zu erstellen, bevor ein Element gelöscht wird:
for (auto it = numbers.begin(); it != numbers.end(); ) { std::set<int>::iterator current = it++; if (*current % 2 == 0) { numbers.erase(current); } }
Diese Lösung trennt das Iterator-Inkrement vom möglichen Löschvorgang und stellt sicher, dass der Iterator, der auf das nächste Element zeigt, erhalten bleibt gültig.
Es ist wichtig zu beachten, dass der Löschvorgang im Allgemeinen alle Iteratoren des Satzes ungültig macht, sofern er nicht speziell für einen bestimmten Container implementiert wird, auch über das entfernte Element hinaus.
Das obige ist der detaillierte Inhalt vonWie entferne ich Elemente während der Iteration sicher aus einem std::set?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!