Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get each nth element of iterator range

Is there any standard implementation (meaning stdlib or boost) of an iterator that wraps another iterator and gives only each nth element of it?

I first thought this would be possible with a fitting predicate and boost::filter_iterator, but the predicate gets only the value and not the base iterator, so it cannot tell the distance to the start.

Edit
To give some more information: The iterator should be compatible with functions like std::transform or std::copy. So it should be used like stdlib iterators.

Similar questions:
C++/STL: std::transform with given stride?
Non-unit iterator stride with non-random access iterators

like image 919
Nobody moving away from SE Avatar asked Oct 04 '12 11:10

Nobody moving away from SE


2 Answers

Boost.Range provides a stride adaptor. Using boost::begin/boost::end would net you the associated iterators.

like image 52
Luc Danton Avatar answered Nov 19 '22 09:11

Luc Danton


You can use boost::filter_iterator with predicate like:

 template< typename T, int N >
 struct EveryNth {
    bool operator()(const T&) { return m_count++ % N == 0; }
    EveryNth() : m_count(0) {}
    private:
      int m_count;
 };
like image 39
Zdeslav Vojkovic Avatar answered Nov 19 '22 07:11

Zdeslav Vojkovic