Beim Durchlaufen einer Menge ist es notwendig, bestimmte Elemente basierend auf zu entfernen spezifische Kriterien. Obwohl es logisch erscheinen mag anzunehmen, dass das Löschen eines Elements den Iterator ungültig machen würde, ist dieses Verhalten von der Implementierung abhängig.
Standard 23.1.2.8 besagt: „Die Einfügungsmitglieder dürfen die Gültigkeit von Iteratoren und Verweisen auf den nicht beeinträchtigen.“ Container, und die Erase-Mitglieder sollen nur Iteratoren und Verweise auf die gelöschten Elemente ungültig machen. Auf dieser Grundlage kann nicht davon ausgegangen werden, dass das Löschen eines Elements während der Iteration den Iterator immer ungültig machen würde.
Ein Ansatz besteht darin, nach dem Löschen eines Elements einen Postfix-Inkrementoperator zu verwenden. Dadurch wird die alte Position an die Löschfunktion übergeben und gleichzeitig der Iterator auf eine neuere Position verwiesen:
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { numbers.erase(it++); } else { ++it; } }
Eine andere Methode besteht darin, den aktuellen Iterator zu kopieren und ihn später zu erhöhen:
while (it != numbers.end()) { // Copy the current iterator and increment it std::set<int>::iterator current = it++; int n = *current; if (n % 2 == 0) { // Don't invalidate iterator it, as it points to the next element numbers.erase(current); } }
C 11 vereinfacht diesen Prozess, indem die Erase-Funktion einen Iterator zu dem Element zurückgibt, das auf das zuletzt entfernte Element folgt:
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { it = numbers.erase(it); } else { ++it; } }
Das obige ist der detaillierte Inhalt vonWie lösche ich während der Iteration sicher Elemente aus einem „std::set'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!