Heim > Backend-Entwicklung > C++ > Ist das Löschen von Elementen aus einem „std::set' während der Iteration sicher und wie geht das richtig?

Ist das Löschen von Elementen aus einem „std::set' während der Iteration sicher und wie geht das richtig?

DDD
Freigeben: 2024-12-11 09:47:18
Original
515 Leute haben es durchsucht

Is Erasing Elements from a `std::set` While Iterating Safe and How to Do It Correctly?

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;
    }
}
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage