Problem mit Selbstgeschriebenem Iterator
-
Hallo ...
Ich möchte eine Selbstgeschriebene Kontrollabstraktion die in den Grundzügen
einem STL Forward Iterator entspricht zusammen mit der for_each funktion
zu verwenden.Leider weisst for_each den Iterator ab. Da die Funktion ein Atribut namens
iterator_category überprüft. Gibt es da einen bekannten Workaround, bzw. eine
möglichkeit dem Iterator die iterator_category zu verleihen?Die Struktur des Iterators sieht im moment so aus:
class iterator { public: friend class List; iterator(ListElem*); iterator(const iterator&); T& operator*(); iterator& operator++(); iterator operator++(int); bool operator==(const iterator&) const; bool operator!=(const iterator&) const; private: ListElem* pCursor; };Der Iterator ist in eine Klasse zur Realisierung einer einfach
verketteten Liste eingebettet. Das STL Pendant zu verwenden ist leider
hier nicht möglich. Die Liste und der Iterator sind allerdings eingehend
nach Black Box Methode getestet, weshalb ich von deren Richtigkeit ausgehe.Ich hoffe mir kann jemand hierbei weiterhelfen
Vielen Dank schonmal im voraus.
Patrick
-
Deine Klasse muss eben die
std::iterator_traitsspezialisieren, das ist Voraussetzung für eine Iterator-Klasse. Am einfachsten geht das, indem Du es durch Erben vonstd::iterator<>implizit machst. Schau in der Doku Deiner Wahl nach, welche Typenparameter dabei vonnöten sind (off the top of my head: Typ, Iterator-Kategorie, …).
-
std::iterator ist tatsächlich der einfachste Weg, da man sich hier auf das Notwendigste beschränken kann, denn die restlichen Defaults sind fast immer richtig:
class iterator : public std::iterator<forward_iterator_tag,T> { public: friend class List; iterator(); // zwingend, muss aber keine Initialisierung durchführen, d.h. der Iterator darf singulär sein iterator(ListElem*); iterator(const iterator&); // für Iteratoren sehr ungewöhnlich, den selbst definieren zu müssen T& operator*(); // muss const sein T* operator->() const; // nötig, falls T eine Klasse ist/sein kann iterator& operator++(); iterator operator++(int); bool operator==(const iterator&) const; bool operator!=(const iterator&) const; private: ListElem* pCursor; };