7

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

我首先认为这可以通过合适的谓词和 boost::filter_iterator 来实现,但是谓词只获取值而不是基迭代器,因此它无法判断到开始的距离。

编辑
以提供更多信息:迭代器应与std::transform或之类的函数兼容std::copy。所以它应该像 stdlib 迭代器一样使用。

类似的问题:
C++/STL: std::transform with given stride?
具有非随机访问迭代器的非单元迭代器步幅

4

2 回答 2

9

Boost.Range 提供了一个跨步适配器。使用boost::begin/boost::end将使您获得关联的迭代器。

于 2012-10-04T11:51:16.607 回答
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;
 };
于 2012-10-04T11:52:34.407 回答