Eigene Iteratoren schreiben
-
Im Grunde ist es witzig, dass in den wenigen Fällen, in denen die Standardbibliothek etwas mehr als das Notwendige "der Bequemlichkeit wegen" anbietet, dieses Mehr meistens überhaupt nichts bequmer macht. Jedenfalls spart man mit std::iterator nur eine handvoll Zeichen ein. Bei sowenig Ersparnis ist mir dann sogar die damit nötige Vererbung zuviel.

Wenn es um weniger Schreiben geht, könnte man hier leicht sparen, indem man die Operatoren von vornherein nicht als Templates anlegt. Darauf habe ich hier der Systematik wegen verzichtet. Und falls sich jemand wegen den außerhalb der Klasse angelegten Operatoren wie ++ und += wundert: das dient der Imitation von Pointern, bei denen diese Operatoren auf rvalues nicht angewendet werden können (für Iteratoren im allgemeinen ist es undefiniertes Verhalten); man denke an das berüchtigte --container.end(). Für den Zuweisungsoperator geht das leider nicht und ich bin bekanntermaßen kein Fan von const T als Rückgabetyp.
-
Wenn du eh Boost hast (und auch sonst), solltest du Boost.Iterator verwenden. Da ist sogar bereits ein Iterator-Adapter namens filter_iterator drin, der so ungefähr das tun sollte, was du haben willst.
-
Vielen Dank für eure Antworten!
Haben mir wirklich weitergeholfen
-
Wie erkenn ich denn, ob ich am Ende des Iterators angekommen bin,
wenn ich meinen ursprünglichen vector (oder ähnliches) nicht mehr zur Verfügung
hab, sondern nur den std::iterator?
-
IteratorBasis schrieb:
Wie erkenn ich denn, ob ich am Ende des Iterators angekommen bin,
wenn ich meinen ursprünglichen vector (oder ähnliches) nicht mehr zur Verfügung
hab, sondern nur den std::iterator?indem Du Dir innerhalb des neuen (Filter-)Iterators auch den ursprünglichen Ende-Iterator merkst. Folge dem Link von .filmor
.filmor schrieb:
Da ist sogar bereits ein Iterator-Adapter namens filter_iterator drin, der so ungefähr das tun sollte, was du haben willst.
und schau Dir das Beispiel an.
Gruß
Werner
-
Danke Werner,
ich dachte es geht etvl. ohne (zusätzliches) cachen des letzten Elementes...
-
Warum geht das so nicht?
#include <vector> template<typename T> class Test { Test(); virtual ~Test(); private: std::vector<T>::iterator it; };Der Kompiler meldet:
9 Test.h expected `;' before "it"Mit nem normalen std::vector<T> geht es, warum nicht mit std::vector<T>::iterator?
Vielen Dank im voraus,
Iterator
-
fehlt eine typename:
private: typename std::vector<T>::iterator it;
-
Wie easy...
Danke
-
Hallo,
jetzt hab ich das Problem, dass ich nicht weiß wie ich über einen
const std::vector<T> iteriere...
Solange ich das const weglasse funktioniert es, sonst nicht...const std::vector<T>& listb = myMethod(); // liefert const std::vector<T>& zurück typename std::vector<T>::iterator it2 = listb.begin();Kann ich nicht über einen const Vector iterieren?
Gruß,
Iterator
-
Fehlermehldung:
invalid conversion from `const MyObj* const* const' to `const MyObj**'
-
typename std::vector<T>::const_iterator it2vielleicht solltest du dir mal mehr über die std container und iteratoren durchlesen.
http://www.sgi.com/tech/stl/Container.html
http://www.sgi.com/tech/stl/Iterators.html