list iterator : direkte zuweisung eines Listen elements:



  • Nein, das geht nicht - die list<> enthält Kopien der übergebenen Werte, hat also überhaupt keinen Bezug mehr zu den Variablen x,y und z deines Hauptprogramms. Und die Variablen selber wissen überhaupt nicht, daß (und wenn ja, wo) irgendwo Kopien von ihnen herumfliegen.



  • ok gut ist eigentlich logisch:

    wenn ich nun sowas schreibe:

    oRoot.front().father = std::find(oRoot.begin(), oRoot.end(),*(oRoot.front()));
    

    Error: illeal indirektion

    P.S: oRoot.front().father == iterator



  • Geht es hier immer noch um deine altbekannte Baumstruktur? Wenn ja: Was genau verbirgt sich hinter oRoot?

    PS: Ich würde mal vermuten, das Sternchen dort hinten ist überflüssig.



  • ich bruach für Root als einzigsten element einen iterator auf das element... (sonderafall) d.h. der iterator zeigt auf das objekt in der Liste, welceh aber nur ein objekt enthält..

    ohne das sternchen:

    c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\algorithm(31): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::allocator<_Ty>::value_type' (or there is no acceptable conversion)
    with
    [
    _Ty=node
    ]



  • *ausdernasezieh* und, gibt es einen operator== für node?



  • Sorry !!

    ne.. gibt net will die referenz des objekt vergleiche... 😉 wie mach ich das dann



  • @CStoll: So sieht meine ++ operator aus..

    if(!pos->children.empty()){
    			pos_type tmp= pos;
    			pos= pos->children.begin();
    			pos->father=tmp;
    		}
    		//pos->father!= NULL ? (--pos->father->children.end()) : 
    		if(pos->father!= NULL && pos != (--pos->father->children.end())){
    			pos_type tmp=pos->father;
                node *pX= &(*(++pos));
    			pos->father=tmp;
    		}
    		else{
    
    			pos_type tmp=NULL;
    			pos= ++(pos->father);
    
    			if(pos->father != NULL)
    				tmp=pos->father;
    
    			pos->father=tmp;
    
    			while(!pos->children.empty()){
    				pos_type tmp= pos;		
    				pos=pos->children.begin();
    				pos->father=tmp;
    			}
    	}
    

    dadurch das root aber kein father iterator zeigt welcher aud die rott selber zeigt, knallts...



  • Erstmal solltest du den Baum während des Traversierens nicht auseinandernehmen (pos gehört den Baum-Iterator und kann/muss weitergeschoben werden, pos->father solltest du nur lesen).

    Und zweitens: Du hast doch schon die Abfrage if(pos->father!=NULL) , die prüft, ob du die Wurzel (nicht) erreicht hast - das fehlt nur noch ein else return *this; (wenn du beim Vorwärtsgehen zur Wurzel zurückgekommen bist, hast du den Baum komplett durchlaufen).

    Drittens: Vergleich mal deinen Code mit dem, was ich dir bei den letzten Threads gegeben habe. Du gehst auf jeden Fall nicht weit genug nach oben, um wirklich den nächsten verfügbaren Onkel zu treffen (der muß nicht unbedingt in der Ebene über dir sein ;)).

    Viertens: find() benötigt den Vergleichsoperator, um festzustellen, ob die Suche erfolgreich war. Im einfachsten Fall kannst du ihn definieren als:

    bool operator==(const node& l, const node& r)
    { return &l==&r; }//Gleichheit definiert als Objektidentität
    

    Alternativ kannst du einen Funktor schreiben, der zwei Objekte auf Identität vergleicht, und find_if() damit füttern.



  • pos->father msus ich schreiben..

    wenn vom Vater Knote naus der erste Knoten pos ist

    und ich pos++ mache.. geht er ja zum nachbar (bruder) diese neu pos kennt aber father nich nicht als muss ich ihm den den pos->fathter vom vorigen linken knonten zuweise, damit der neue konten pos weis wer sein vater ist!!



  • BorisDieKlinge schrieb:

    und ich pos++ mache.. geht er ja zum nachbar (bruder) diese neu pos kennt aber father nich nicht als muss ich ihm den den pos->fathter vom vorigen linken knonten zuweise, damit der neue konten pos weis wer sein vater ist!!

    Da hast du etwas beim Aufbau des Baumes falsch gemacht. Du solltest den father-Link schon dann korrekt eintragen, wenn du den Knoten in den Baum einfügst. (und wenn du Probleme mit den end()-Iteratoren befürchtest - die darfst du gar nicht dereferenzieren und ihnen demzufolge auch keinen neuen father zuweisen)

    PS: Nur aus persönlichem Interesse, aber was genau willst du mit dieser Baumstruktur erreichen?



  • BorisDieKlinge schrieb:

    pos->father msus ich schreiben..

    Ja, aber doch nicht im Iterator!

    Warum setzt du diese Information nicht sofort, wenn ein Knoten eingetragen oder verschoben wird? Es ist doch nicht Aufgabe eines Iterators, die Datenstruktur seines Containes aufzuräumen.



  • Für deine persönliche Interesse:

    Die baumstruktur soll später eine gruppierung von Zeitlichen Allokationen darstellen , wobei dann quasie ein Knoten mit Kinder Knoten die Alloktioen mit der gesamtzeit aller darunterliegenden Allokationen darstellt.

    die gesamstzeit alle Blätter allokationen entsprich dann der zeit der Knoten allokationen (Hauptallokation)

    und ich muss primär nur die blätter iterieren können...

    wenn ich bespielsweise eien knoten an den Vater welcher der zweit knoten des Großvaters ist anhängen will, muss ich ja quasie den iterator des Grovaters erst inkrementieren damit ich einen enkel an den richtigen vater anhägen kann?

    EDIT: @MFK.. ja .. hab gedacht.. das ist überflüssig... sorry...



  • So, damit sind wohl alle Klarheiten beseitigt 😃

    Eventuell kannst du dir die Arbeit erleichtern, wenn du nur eine Liste für ALLE Knoten verwendest und in jedem Knoten nur drei Iteratoren auf seinen Vater und seine Söhne verwaltest. (da mußt du beim Einfügen nur darauf achten, daß die Kinder eines Knotens zusammenhängend in der Liste stehen)



  • wenn ich ein kindkonten anfüge, ist es dann so in ordnung ?

    void add(node &oChild){
    
    		oChild.father= (--children.end());
    		//oScr.pFather=this;
    		children.push_back(oChild);
    
    	}
    

    so wird beim anhängen dem kindkonten der vater iterator zugewiesen? oder geht das so nich?

    wenn ich nun irgendwo ein knoten einfüge, muss ich ja alle vater-itoratoen der brüder knoten anpassen nehm ich an??

    Zu deiner IDEE mit alle Knoten in einer Liste (was sich nich schlecht anhört) versteht ich aber nicht dies : => "in jedem Knoten nur drei Iteratoren auf seinen Vater und seine Söhne verwaltest"



  • wenn du primär nur über die blätter iterieren musst, dann nutz doch eine std::list, die zeiger auf die Knoten enthält. Dann musst du nurnoch über die liste anstatt über den Baum iterieren.
    Ist zwar ein wenig zusätzlicher speicherverbrauch, aber einfacher zu implementieren und schneller.



  • BorisDieKlinge schrieb:

    Zu deiner IDEE mit alle Knoten in einer Liste (was sich nich schlecht anhört) versteht ich aber nicht dies : => "in jedem Knoten nur drei Iteratoren auf seinen Vater und seine Söhne verwaltest"

    Ein Iterator zeigt auf den Vater und zwei definieren den Bereich, in dem die Kinder stehen.


Anmelden zum Antworten