Wie soll sich ein Iterator verhalten, wenn



  • Ich progge an meinem binären Baum, schreib nen Iterator. Der Baum ist eng mit dem Iterator verknüpft, ohne einen Iterator kann man mit dem Baum fast nichts machen (außer löschen). Nun gibt es aber ein Problem. Man denke sich einen Baum:

    |
       5       6
       |       |
    9     4 2      7
    

    Der "|" ganz oben stellt die Wurzel dar. Iterator a zeigt auf 4, b auf 5. Nun hat der Iterator z.B. die Funktion deep_erase(), die das Element auf das er zeigt und alle weiter unten löscht. Wenn b nun deep_erase benutzt,sieht der Baum also dann so aus:

    |
               6
               |
            2      7
    

    Aber a zeigt ins nichts. Wie kann ich das feststellen, beheben,..., wie soll sich der Iterator a verhalten?



  • Er könnte sich so verhalten wie beim std::vector: er ist undefiniert! Sobald man bei einem vector etwas löscht, werden alle Iteratoren ungültig.



  • Kann ich einen stl-Iterator fragen ob er ungültig ist? (Bitte sag nein, dann ist mein Problem gelöst 😃 )



  • nein



  • wo ist eigentlich der sinn bei bäumen mit iteratoren zu arbeiten?
    iteratoren sind imho dazu da durch die elemente durch zu iterieren, nur wann braucht man das bei einem baum?
    ein baum ist dazu da daten zu speichern und sie wieder schnell zu finden. wozu also iteratoren die durch jeden einzelnen knoten durch iterieren ?
    das ist ja so als ob man keinen baum mehr hat sondern eine liste...



  • Nun hat der Iterator z.B. die Funktion deep_erase()

    womit er sich nicht mehr wie ein iterator verhält, und somit kein iterator mehr ist. Normalerweise sollte man sich bei iteratoren an folgenden leitsatz halten: iteratoren sollten sich wie pointer verhalten.

    Zwar kann man mit manchen iteratoren(in java) löschvorgänge durchführen, aber auch da immer nur auf das element, auf welches der iterator zeigt(alles andere währe nicht grad der sache dienlich)



  • Und was ist es dann? Ich kann auch der node Klasse ne deep_erase-Funktion spendieren, aber das ist relativ unhandlich...



  • um nochmal genauer zu werden:

    ein deep_erase gehört nicht in einen iterator, da dies implementationsdetails offenlegt,man gibt zumindest an, dass der entsprechende container ein Baum ist(worauf sonst könnte sich ein deep_erase sinnvoll beziehen?), und das ziel des iterators ist ansich aber, dass man den dahinterstehenden container verdeckt.


Anmelden zum Antworten