CStoll und Co.: Baum-Iterator fast komplett.. aber noch ein Fehler??
-
bisher mein code (bishen viel hoffe ihr macht euch die mühe schnell durchzuschaun) in der next methode des iterator stimmt der itrator "pCur->MyIt" nicht mehr warumm?????
Hab das jetzt bischen anderes gemacht bei der iteration.. müsste eigentlich klappten:
class node { public: std::list<node> children; std::list<node>::iterator MyIt; node *pFather; // std::list<node>::iterator father; int i; node(int k) : i(k)/*, MyIt(children.begin())*/{ //MyIt = children.begin(); } void add(node &oChild){ oChild.pFather=this; children.push_back(oChild); } bool operator==(const node &A) const { return (&A == this) ? true : false; } }; class Biterator{ public: node *pCur; Biterator(node *pStart): pCur(pStart){ while(!pCur->children.empty()){ pCur->MyIt = pCur->children.begin(); pCur= &(*pCur->MyIt); } } void next(){ if(!pCur->children.empty()){ pCur->MyIt = pCur->children.begin(); pCur= &(pCur->children.front()); } else if(pCur->pFather && pCur->pFather->MyIt != (--pCur->pFather->children.end())){ // HIER STIMMT DER iterator es vater MyIt nich mehr .. warum??? pCur = &(*(++(pCur->pFather->MyIt))); } else if(pCur->pFather) { do{ pCur= pCur->pFather; }while(pCur->pFather->MyIt == (--(pCur->pFather->children.end()))); pCur = &(*(++(pCur->pFather->MyIt))); } } }; class Base{ public: node oRoot; Base() : oRoot(0) { oRoot.pFather=NULL; } };Oder ist hier wieder ein Denkfehler drin?
-
Wohin soll denn MyIt zeigen? Dem Namen nach würde ich vermuten, auf die eigene Position aus Sicht des Vaters. Wenn das so ist, hast du dich womöglich mit den Verzweigungen etwas verknotet.
(tip: Mal dir die gesamte Struktur mal auf und schau dir dort an, wohin du eigentlich gehen mußt/willst)
-
genau Myit ist die position des Kindes der aktuellen Knotens..
Hab schon 1 Milliarade Baumstruktiren gezeichnet...
schau mal im Kosntruktor des Iterators... die Schleife ist doch korrekt oder nich.. ? Aber irgendowe sind die Iteratoren später kaputt??
pCur = Zeiger auf Startknoten
while(!pCur->children.empty()){ // Knoten (pCur) hat kinder eingener Knoten iterator MyIt auf das erste Kind setzen pCur->MyIt = pCur->children.begin(); //Nun zu diesem Kind springen.. pCur= &(*pCur->MyIt); }
-
Wie MFK Schon beim letzten Thread schrieb, sollte der Iterator die Baumstruktur nicht ändern (und dazu gehört auch, daß du die Elemente hinter pCur zwar lesen, aber nicht schreiben solltest).
-
in dem fall, ist diese Methode der iterieren total mülll... und kann wieder neu anfangen