Elemente aus std::set während der Iteration löschen: Ist das sicher?
Das Durchlaufen einer Menge und das Entfernen von Elementen, die bestimmte Kriterien erfüllen, ist eine häufige Aufgabe in der C-Programmierung. Das Verhalten beim Löschen von Elementen während der Iteration kann jedoch Bedenken hinsichtlich der Ungültigmachung von Iteratoren hervorrufen.
Im bereitgestellten Codeausschnitt iterieren Sie durch eine Reihe von Ganzzahlen und löschen gerade Zahlen. Obwohl dieser Code zu funktionieren scheint, basiert er auf dem umsetzungsspezifischen Verhalten. Der C-Standard legt nicht explizit fest, was passiert, wenn ein Element aus einer Menge gelöscht wird, während Sie diese durchlaufen.
Standardkonformer Ansatz
Um Portabilität sicherzustellen und Um die Zuverlässigkeit zu gewährleisten, sollten Sie einen standardkonformen Ansatz in Betracht ziehen:
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { numbers.erase(it++); } else { ++it; } }
Dieser Ansatz verwendet den Postfix-Inkrementoperator it , der den alten Iterator übergibt zu löschen, rückt es jedoch vor, um auf das nächste Element zu zeigen, bevor es zurückkehrt. Dadurch wird die Schleife korrekt durchlaufen und der Iterator bleibt nach jedem Löschvorgang gültig.
C 11-Lösung
C 11 hat eine aktualisierte Löschmethode für set that eingeführt vereinfacht den Prozess des Löschens von Elementen während der Iteration:
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { it = numbers.erase(it); } else { ++it; } }
Dieser Ansatz verwendet die Erase-Methode, die eine zurückgibt Iterator zum Element, das auf das gelöschte Element folgt (oder set::end, wenn das letzte Element gelöscht wird). Dies vereinfacht die Schleife, indem die Verwendung von Postfix-Inkrementen überflüssig wird und sichergestellt wird, dass es nach jedem Löschvorgang gültig bleibt.
Fazit
Während das ursprüngliche Code-Snippet möglicherweise funktioniert Bei einigen Implementierungen wird es im Allgemeinen nicht empfohlen, sich auf implementiertes spezifisches Verhalten zu verlassen. Durch die Verwendung eines standardkonformen Ansatzes oder der C 11-Löschmethode können Sie sicherstellen, dass Ihr Code korrekt und portierbar auf verschiedenen Compilern und Plattformen funktioniert.
Das obige ist der detaillierte Inhalt vonIst das Löschen von Elementen aus einem „std::set' während der Iteration sicher und wie geht das richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!