C ++ std :: list: Löschen / Entfernen von Elementen beim Iterieren [duplizieren]

8

Ich habe eine Schleife in einer Funktion, die von Anfang bis Ende über ein std::list iteriert.

In jedem Zyklus führe ich einige Überprüfungen durch und mache vielleicht ein paar Manipulationen am aktuellen Listeneintrag, und in manchen Fällen möchte ich aus der Liste entfernen .

Nun, wie erwartet, wird mein Iterator ungültig gemacht.

  • Gibt es eine Möglichkeit, dies zu umgehen, indem Sie Elemente aus einer Liste entfernen, während Sie darüber iterieren?
Jarx 10.03.2011, 20:26
quelle

3 Antworten

14

Verwenden Sie postfix Inkrement.

%Vor%

it wird erhöht, sodass es sich nicht mehr auf das gelöschte Element bezieht, dann wird der vorherige Wert von it an list.erase übergeben. Stellen Sie sicher, dass Sie entweder list.erase(it++) oder ++it in Ihrer Schleife ausführen - indem Sie beide Elemente überspringen und möglicherweise das letzte Ende der Liste erhöhen.

    
Erik 10.03.2011, 20:28
quelle
14

Fange den Rückgabewert von erase und verwende ihn als Iterator. Der Rückgabewert ist ein Iterator zum nächsten gültigen Ort nach dem Löschen.

%Vor%

Referenz

Auszug:

Rückgabewert

Ein bidirektionaler Iterator, der auf die neue Position des Elements verweist, das auf das letzte vom Funktionsaufruf gelöschte Element folgte. Dies ist das Ende der Liste, wenn die Operation das letzte Element in der Sequenz löschte.

    
Sion Sheevok 10.03.2011 20:32
quelle
0

Haben Sie überlegt, den Algorithmus list::remove_if zu verwenden?

    
Mark B 10.03.2011 20:29
quelle

Tags und Links