Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » doppelt verkettete Liste, "dekrement Erase"-Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.09.2006, 19:02 Uhr
0xdeadbeef
Gott
(Operator)


Ich würde it wohl einen virtuellen Status geben, so dass der quasi auf das Element vor head zeigt. it.valid() wäre false, und ++it führte dazu, dass it == head.

Ansonsten evtl. denkbar

C++:
while(bedingung) {
  it.erase(&it);
}


btw, warum eigentlich so umständliche Syntax? it::erase hat doch it schon als this, warum nicht einfach

C++:
it.erase();


?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.09.2006, 19:28 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


für die virtuellen status bräuchte ich natürlich dann im iterator ein flag oder eben ein "dummy-item" das die erste Stelle einnimmt dafür. hmm ist halt auch unschön.

das 2te ist so in der form nicht möglich, da ja noch weitere nicht-bedingungs-code folgen könnte.

und das 3te wahr nachlässigkeit von mir muss natürlich


C++:
liste.erase(&it);



heißen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.09.2006, 19:33 Uhr
0xdeadbeef
Gott
(Operator)


Das Dummy-Item halte ich für ne gute Idee. Macht auch die restliche Implementierung deutlich einfacher. Ich würd auch gleich noch ein tail-dummy-item reinhängen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.09.2006, 19:38 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja das würde aber das restliche konzept vernichten. denn it.valid würde so dann nicht mehr funktionieren. und man müsste bei benutzung sicherstellen das man sich immer in "elementen"bahnen bewegt.

könnte man nicht evtl einfach das erase irgendwie umgestalten. dieses dekrement-erase ist irgendwie beknackt.
--
class God : public ChuckNorris { };

Dieser Post wurde am 12.09.2006 um 19:38 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.09.2006, 19:41 Uhr
Oliver
S2-Pixelgeneral



Zitat:

Das Dummy-Item halte ich für ne gute Idee. Macht auch die restliche Implementierung deutlich einfacher. Ich würd auch gleich noch ein tail-dummy-item reinhängen.



Ja, genau so war es vorher, aber er wollte es ja in seiner "Bürokratenwut" unbedingt umändern.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.09.2006, 19:53 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


natürlich könnte man in dem dekrement-erase natürlich bei löschung von "head" natürlich auf NULL-element setzen udn bei einem ++ oder -- auf ein null element springt er auf head bzw tail, je nachdem ob ++ oder --. werde ich morgen mal ausprobieren (außer es hat jemand noch ne bessere idee die das "valid"-konzept nicht vernichtet.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.09.2006, 21:11 Uhr
0xdeadbeef
Gott
(Operator)


Was spricht denn dagegen, statt mit null mit dem Dummy zu vergleichen? valid wär halt false, wenn der Iterator auf einen der Dummies zeigt. ++ und -- gestalten sich deutlich einfacher, wenn du head->prev = head und tail->next = tail setzt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.09.2006, 22:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja dann hab ich halt die unterscheidung in der valid-funktion. aktuell kann ich einfach auf "return (data != NULL)" prüfen. ich schau mal wie ich das morgen oder so umbau
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.09.2006, 19:50 Uhr
0xdeadbeef
Gott
(Operator)


Prüf halt auf ptr != list.head && ptr != list.tail
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: