跳过迭代器

时间:2011-04-16 10:48:55

标签: c++ boost stl boost-iterators

我有一系列值,我想传递给一个(iterator begin, iterator end)对的函数。但是,我只希望处理原始序列中的每个第二个元素。

有没有一种很好的方法使用Standard-Lib / Boost创建一个迭代器外观,允许我传入原始序列?我认为这样的事情很简单,就像在增强迭代器或范围库中一样,但我没有找到任何东西。

或者我错过了另一个完全明显的方法吗?当然,我知道我总是可以选择将值复制到另一个序列,但这不是我想做的。

编辑:我知道filter_iterator,但过滤了值 - 它不会改变迭代进展的方式。

3 个答案:

答案 0 :(得分:6)

我想你想要boost::adaptors::strided

答案 1 :(得分:3)

struct TrueOnEven {
 template< typename T >
 bool operator()(const T&) { return mCount++ % 2 == 0; }
 TrueOnEven() : mCount(0) {}
 private:
  int mCount;
};

int main() {
 std::vector< int > tVec, tOtherVec;
 ...
 typedef boost::filter_iterator< TrueOnEven, int > TakeEvenFilterType;

 std::copy( 
  TakeEvenFilterType(tVec.begin(), tVec.end()),
  TakeEvenFilterType(tVec.end(), tVec.end()),
  std::back_inserter(tOtherVec));
}

说实话,这不仅仅是美好而直观的。我写了一个简单的“枚举器”库,包括懒惰的集成查询,以避免像上面那样的hotchpotch ..它允许你写:

Query::From(tVec.begin(), tVec.end())
.Skip<2>()
.ToStlSequence(std::back_inserter(tOtherVec));

其中Skip<2>基本上实例化一个通用的“过滤器”,它跳过每个第N个(在这种情况下每秒)元素...

干杯,

答案 2 :(得分:2)

这是Boost的filter iterator。这正是你想要的。

更新:抱歉,读错了。这是Boost中所有迭代器funkiness的列表:

http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/#specialized-adaptors

我认为一个带有重载operator++的普通iterator_adaptor会增加底层迭代器值两次就是你所需要的。