Kleine Iteratorenfrage
-
Ich habe eine Frage zur Funktionsweise von iteratoren, wenn ich mir beispielsweise einen iterator auf das erste Element eines vectors zurückgeben lasse kann ich ja ganz bequem so:
it->name usw.
auf die gespeicherten elemente zugreifen.
Aber der Iterator selber ist ja eigentlich nur eine eigene Klasse, welche wiederum einen Pointer auf eben ein solches vectorelement enthalten müsste.Das einzige was ich hinbekomme ist so etwas:
Klasseiterator.zeigeraufKnoten->elementimKnoten.name
Ich hab schon versucht in die stldateien zu schauen aber na ja
nicht gerade übersichtlich.
Wie funktioniert das?
-
mit einem überladenen operator-> ungefähr so:
T* operator->() { return aktuelles_element; }
-
Wenn ich aber anstatt des -> operators den . operator auf einen iterator für einen vector anwende, gibt mir das visual studio rein gar nichts vor, es werden keine element vom iterator angezeigt.
Das wundert mich gerade, demnach dachte ich das der iterator doch irgendwie anders aufgebaut ist als meiner
(Klasseiterator.zeigeraufKnoten->elementimKnoten.name und dann -> überladen).
-
Der vector-Iterator kann theoretisch ein Zeiger sein, vielleicht ist das beim VC ja so. Versuchs mal mit list oder so. Aber eigentlich fragst du schon was, das mit C++ nichts mehr zu tun hat ...
-
Bashar schrieb:
Aber eigentlich fragst du schon was, das mit C++ nichts mehr zu tun hat ...
Wieso?
Tatsache ist (ich hab eben nachgeschaut) bei der list bietet er per .operator was an (Standardkonstruktor und die ganzen überladenen operatoren). Zwar immer noch kein Pointer auf ein Node aber immerhin
Ist denn meine Methode eher eine gebräuchliche oder ist das Käse:
KlasseIterator.ZeigeraufKnoten->ElementimKnoten.name und dann -> überladen
So das mann dann
KlasseIterator->name erhält.
?
-
nixraller schrieb:
Ist denn meine Methode eher eine gebräuchliche oder ist das Käse:
KlasseIterator.ZeigeraufKnoten->ElementimKnoten.name und dann -> überladen
So das mann dann
KlasseIterator->name erhält.
versteh ich nicht, gib mal was konkreteres.
-
Gleich, jetzt erstmal mittag machen
-
Also:
Ich habe eine list.h, die includiert iterator.h.
template<class T> class Iterator { public: Iterator(){ node = NULL; }; Iterator(Node<T> *n){ node = n; }; void operator++(){ node = node->GoNext(); }; T operator->(){ /*überladen*/ }; // private: Node<T> *node; };
Der iterator enthält einen pointer auf einen Knoten. Der Knoten enthält eben den Pointern auf das nächste / vorherige Knotenelement noch das Element welches in der Liste gespeichert wird.
Jetzt überlade ich den ->operator im iterator und erhalte so dann direkt Zugriff auf das Element im Knoten auf welches der node-pointer zeigt.
Das wäre meine Idee einen Iterator zu programmieren, ist das der "übliche" Weg?
-
operator-> sollte (oder muss?) ein Objekt zurückgeben, was ebenfalls den operator-> unterstützt, so dass it->foo äquivalent zu (*it).foo ist. Ich würde ihn also so implementieren:
T* operator->() { return &node->element; }
-
Yo deine Lösung ist imho besser.
Ansonsten bin ich jetzt zufrieden
Falls aber jemanden auffällt das ich irgendwie etwas untypisches mache bitte melden