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

Upvotes: 9

Views: 3598

Answers (2)

Zdeslav Vojkovic
Zdeslav Vojkovic

Reputation: 14581

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;
 };

Upvotes: 5

Luc Danton
Luc Danton

Reputation: 35449

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

Upvotes: 9

Related Questions