Is there a standard cyclic iterator in C++

后端 未结 6 1890
野性不改
野性不改 2020-12-13 19:30

Based on the following question: Check if one string is a rotation of other string

I was thinking of making a cyclic iterator type that takes a range, and would be a

6条回答
  •  粉色の甜心
    2020-12-13 19:47

    There is nothing like this in the standard. Cycles don't play well with C++ iterators because a sequence representing the entire cycle would have first == last and hence be the empty sequence.

    Possibly you could introduce some state into the iterator, a Boolean flag to represent "not done yet." The flag participates in comparison. Set it true before iterating and to false upon increment/decrement.

    But it might just be better to manually write the algorithms you need. Once you've managed to represent the whole cycle, representing an empty sequence might have become impossible.

    EDIT: Now I notice that you specified the number of cycles. That makes a big difference.

    template< class I >
    class cyclic_iterator
     /* : public iterator< bidirectional, yadda yadda > */ {
        I it, beg, end;
        int cnt;
        cyclic_iterator( int c, I f, I l )
            : it( f ), beg( f ), end( l ), cnt( c ) {}
    public:
        cyclic_iterator() : it(), beg(), end(), cnt() {}
    
        cyclic_iterator &operator++() {
            ++ it;
            if ( it == end ) {
                ++ cnt;
                it = beg;
            }
        } // etc for --, post-operations
    
        friend bool operator==
            ( cyclic_iterator const &lhs, cyclic_iterator const &rhs )
            { return lhs.it == rhs.it && lhs.cnt == rhs.cnt; } // etc for !=
    
        friend pair< cyclic_iterator, cyclic_iterator > cycle_range
            ( int c, I f, I l ) {//factory function, better style outside this scope
            return make_pair( cyclic_iterator( 0, f, l ),
                              cyclic_iterator( c, f, l ) );
        }
    };
    

提交回复
热议问题