Get each nth element of iterator range

2019-01-27 23:30发布

问题:

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

回答1:

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



回答2:

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