000
12.09.2006, 18:30 Uhr
FloSoft
Medialer Over-Flow (Administrator)
|
Hi, also wir haben ne doppelt verkettete Liste, welche eine dekrement-erase funktion hat d.h
man macht z.b (templatesachen etwas vereinfacht geschrieben nun)
C++: |
iterator it = liste.end(); while(it.valid()) liste.erase(&it); // entfernt das objekt und setzt it auf den vorherigen wert // hier ist dadurch dann die liste leer
|
Das Problem tritt nun aber in einer for-schleife auf:
C++: |
for(iterator it = liste.begin(); it.valid(); ++it) { if(bedingung == true) { it.erase(&it); // sorry muss natürlich liste.erase(&it); heißen } }
|
Falls nun "it" das erste Element ("head") ist, dann kann der iterator logischerweise in der Funktion nicht dekrementiert werden und zeigt auf den neuen head. Das Problem ist: das ++it wird danach ja ausgeführt -> ein Item wird übersprungen.
Wie könnte man das lösen bzw was macht hier sinn? Wichtig hierbei ist es, das die liste bei 0 Elementen auch wirklich 0 Elemente enthält und keinen "dummy"-head.
Natürlich in dem Fall oben wäre es möglich die Liste rückwärts zu durchlaufen (wie in meinem Beispiel) und bei nichteintreten der bedingung einfach --it aufzurufen. Nur ist das halt irgendwo unschön. (ok das dekrement-erase ist auch unschön, nur bräuchte man halt was um ein element in einer forschleife zu entfernen ohne die liste "neustarten" zu müssen bzw eine "kill-list" zu führen) -- class God : public ChuckNorris { }; Dieser Post wurde am 12.09.2006 um 19:25 Uhr von FloSoft editiert. |