der ast auf dem man sitzt? iterator und list.erase()
-
it = list.erase(it);
-
ich würde es nicht empfehlen - du benötigst einen gültigen Iterator, um weitermachen zu können und der gerade gelöscht ist nicht mehr gültig.
Also Fazit: kopieren, weiterzählen, und anschließend über die Kopie das Element löschen:
typedef list<MyClass>::iterator listit; for(listit it=liste.begin();it!=liste.end();) { listit kopie=it++;//post-Inkrement -> kopie erhält Wert vor Inkrement if(loeschbar(*kopie) liste.erase(kopie); }Edit: Btw, bei std::list wird nur der gelöschte Iterator ungültig

-
typedef list<MyClass>::iterator listit; for (listit it=liste.begin();it!=liste.end();) { if (loeschbar(*it)) { it = liste.erase(it); } else { ++it; } }
-
einen haufen fehler hats verursacht. gehen erstmal essen.
-
Warum verwendest du nicht gleich list::remove_if()?
bool checkFunc(int const& val) { if(/* bedingung */) { return true; } return false; } liste.remove_if(&checkFunc);Gruß
-
remove_if() ist hier gut geeignet, aber bedenke, dass du nachher noch erase aufrufen musst. Also konzeptionell:
erase(remove_if())Ein kleiner Trick, der mir erstmals vor kurzem im Meyers (STL) aufgefallen ist:
l.erase(it++)Ist kurz zu schreiben und korrekt (it steht nach dem Löschen am nächsten Element).
-
finix schrieb:
typedef list<MyClass>::iterator listit; for (listit it=liste.begin();it!=liste.end();)- muss in der genericDef nich ein * nach dem objektnamen gesetzt werden?
- kann das sein dass in der forschleife das inkrement vergessen wurde?

-
benshman schrieb:
finix schrieb:
typedef list<MyClass>::iterator listit; for (listit it=liste.begin();it!=liste.end();)- muss in der genericDef nich ein * nach dem objektnamen gesetzt werden?
Wie bitte?
- kann das sein dass in der forschleife das inkrement vergessen wurde?
Nicht vergessen, absichtlich ausgelassen (weil der Iterator bereits innerhalb der Schleife weitergezählt wird).
-
typedef list<MyClass*>::iterator listit;qausi so
-
Das kommt ganz darauf an, wie deine Liste definiert ist - du benötigst den iterator des verwendeten Listentyps (und zu list<MyObject> aus deinem Eröffnungsbeitrag gehört list<MyObject>::iterator (ohne *)).
-
super.
danke.klappt alles super!

danke nochmal!