"Cycling" iterator?



  • Ich bräuchte einen zyklischen Iterator, der einen Container zyklisch durchläuft, also statt den Beginn und das Ende manuell zu überprüfen

    void cycleVector()
    {
        vector<int> intV;
    
        // fill vector...
    
        typedef vector<int>::const_iterator Cit;
        Cit cit = intVector.begin();
    
        switch(key)
        {
        case CursorDown:
            if (cit == intV.end())
            {
                cit = intV.begin();
            }
            else
            {
                 ++cit;
            }
            // get item...
            break;
        case CursorUp:
            if (cit == intV.begin())
            {
                cit = intV.end() - 1;
            }
            else
            {
                --cit;
            }
            // get item
            break;
            [...]
        }
    }
    

    Hatte schon die Idee mit Modulo-Fkt

    cit = ((cit++) % size + size) % size
    

    aber leider ist operator% für Iteratoren nicht definiert.
    Gibt es das was in der STL (vermute mal nicht)?



  • Kannst dir ja ganz einfach deinen eigenen Iterator bauen:

    template<class Iterator>
    class cycling_iterator : boost::iterator_adaptor<cycling_iterator<Iterator>, Iterator>
    {
    public:
        cycling_iterator(Iterator beg, Iterator end)
            : boost::iterator_adaptor<cycling_iterator<Iterator>, Iterator>(beg), end(end) {}
    private:
        Iterator end;
        friend class boost::iterator_core_access; // hieß eventuell anders
        void increment()
        {
            base_reference()++;
            if(base() == end)
               base_reference() = beg;
        }
    };
    
    //...
    
    cycling_iterator<vector<int>::iterator> i(v.begin(), v.end());
    // immer wider ++i machen
    

    (ungetestet)



  • schreib dir den operator doch selbst für iteratoren
    irgendwie mithilfe von if ( it == end() ) it = begin(); oder so


Anmelden zum Antworten