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_traits spezialisieren, das ist Voraussetzung für eine Iterator-Klasse. Am einfachsten geht das, indem Du es durch Erben von std::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, …).


  • Mod

    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;
    };
    

Anmelden zum Antworten