获取迭代器范围的每个第n个元素

时间:2012-10-04 11:40:55

标签: c++ boost iterator std

是否有一个迭代器的标准实现(意思是stdlib或boost)包装另一个迭代器并且只给出它的每个第n个元素?

我首先想到的是,使用拟合谓词和boost :: filter_iterator可以实现这一点,但是谓词只获取值而不是基本迭代器,所以它无法告诉起始距离。

修改
提供更多信息: 迭代器应与std::transformstd::copy等函数兼容。 所以它应该像stdlib迭代器一样使用。

类似的问题:
C++/STL: std::transform with given stride?
Non-unit iterator stride with non-random access iterators

2 个答案:

答案 0 :(得分:9)

Boost.Range提供a stride adaptor。使用boost::begin / boost::end可以获得相关的迭代器。

答案 1 :(得分:5)

您可以将boost::filter_iterator与谓词一起使用:

 template< typename T, int N >
 struct EveryNth {
    bool operator()(const T&) { return m_count++ % N == 0; }
    EveryNth() : m_count(0) {}
    private:
      int m_count;
 };