Easiest way to make a cyclic iterator (circulator)?

后端 未结 3 1513
悲哀的现实
悲哀的现实 2020-12-01 04:39

I have an object that I want to travel in a continuous loop in a game. I have a series of coordinates in a std::vector that I want to use as waypoints.

3条回答
  •  独厮守ぢ
    2020-12-01 05:38

    Ok, now your problem is clearer :-)

    Take a look at boost::iterator_facade and boost::iterator adaptor. They implement the full iterator interface and your cycle_iterator only as to implement a few methods like increment(), decrement():

    template
    class cycle_iterator 
         : public boost::iterator_adaptor< 
              cycle_iterator,     // the derived class overriding iterator behavior
              IteratorBase,       // the base class providing default behavior
              boost::use_default, // iterator value type, will be IteratorBase::value_type
              std::forward_iterator_tag, // iterator category
              boost::use_default  // iterator reference type
           > 
    {
      private:
         IteratorBase m_itBegin;
         IteratorBase m_itEnd;
    
      public:
         cycle_iterator( IteratorBase itBegin, IteratorBase itEnd ) 
           : iterator_adaptor_(itBegin), m_itBegin(itBegin), m_itEnd(itEnd)
         {}
    
         void increment() {
            /* Increment the base reference pointer. */
            ++base_reference();
    
            /* Check if past-the-end element is reached and bring back the base reference to the beginning. */
            if(base_reference() == m_itEnd)
                base_reference() = m_itBegin;
         }
    
         // implement decrement() and advance() if necessary
      };
    

    This probably doesn't compile but should get you started.

    Edit:

    boost::iterator_adaptor implements the full iterator interface in terms of few functions. It provides default implementations for increment(), decrement(), advance(), distance_to(), equal_to() and dereference() using the base iterator passed down to the iterator_adaptor base class.

    If all you need is a forward iterator, only the increment() method must be implemented to wrap around once you reach the end iterator. A cyclical iterator can be bidirectional if you implement decrement() in a similar fashion. If IteratorBase is itself a random access iterator, the cycle iterator can also be random access and method advance and distance_to must be implemented using modulo operations.

提交回复
热议问题