"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) % sizeaber 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