Der richtige Code ist folgende:
for (std::list<int>::iterator itr = lst.begin(); itr != lst.end(); /*nothing*/)
{
if (*itr > 10)
itr = lst.erase(itr);
else
++itr;
}
Wenn Sie ein Element aus der Liste löschen, den Iterator ungültig machen kann daher müssen Sie löschen erase
(falls es zeigt auf das Element gelöscht werden.) (die einen gültigen Iterator zurückgibt, der auf das nächste Element zeigt).
noch bessere Idee wäre mit std::remove_if
:
bool greater_than_10(int x)
{
return x > 10;
}
lst.remove_if(greater_than_10);
Wenn Ihr Compiler lambdas unterstützt, können Sie es ausdrückte noch kürzer:
lst.remove_if([](int x){ return x > 10; });
(Ich habe diesen Code nicht testen, wie mein Compiler ist nicht so neu, die Lambda-Funktion wird dankenswerterweise aus @John Diblings Antwort gestohlen.)
Tatsächlich löscht das Löschen aus der Liste only the iterators pointing to the item being deleted. Beachten Sie jedoch, dass andere STL-Container diese Eigenschaft nicht haben.
Also, kurz gesagt: im Allgemeinen, sollten Sie nicht die Elemente aus der Liste löschen, während sie durch das Iterieren, weil die Löschung des Iterator ungültig machen kann (und das Programm wird möglicherweise Absturz). Wenn Sie jedoch absolut sicher sind, dass die Elemente, die Sie löschen, nicht die Werte sind, die von einem der Iteratoren referenziert werden, die Sie zum Zeitpunkt des Löschens verwenden, können Sie löschen. Beachten Sie, dass die Einschränkung für die anderen STL-Container (z. B. Vektoren) noch strenger ist: Löschen aus dem Container macht nicht nur Iteratoren ungültig, die auf das gelöschte Element zeigen, sondern möglicherweise auch andere Iteratoren! So ist das Löschen von diesen Containern während der Iteration noch problematischer.
möglich Duplikat [Löschen Elemente aus einer STL-Liste] (http://stackoverflow.com/questions/501962/erasing-items-from-an-stl-list) – sth
Ja, aber nicht auf diese Weise. –
mögliches Duplikat von [Können Sie Elemente aus einer std :: list entfernen, während Sie sie durchlaufen?] (Http://stackoverflow.com/questions/596162/can-you-remove-elements-from-a-stdlist-while- Iterating-through-it) – AShelly