13

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

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

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

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

4

3 回答 3

6

我想你想要boost::adaptors::strider

于 2014-09-23T22:03:41.933 回答
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));
}

老实说,这不是很好和直观的。我写了一个简单的“枚举器”库,包括惰性集成查询,以避免像上面这样的热点问题。它允许您编写:

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

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

于 2011-04-16T11:19:50.890 回答
2

这是 Boost 的过滤器迭代器。这正是你想要的。

更新:对不起,读错了。这是 Boost 中所有迭代器功能的列表:

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

我认为一个简单的 iterator_adaptor 具有一个重载operator++的基础迭代器值增加两次是你所需要的。

于 2011-04-16T11:01:51.070 回答