我有一系列值,我想传递给一个(iterator begin, iterator end)
对的函数。但是,我只希望处理原始序列中的每个第二个元素。
有没有一种很好的方法使用Standard-Lib / Boost创建一个迭代器外观,允许我传入原始序列?我认为这样的事情很简单,就像在增强迭代器或范围库中一样,但我没有找到任何东西。
或者我错过了另一个完全明显的方法吗?当然,我知道我总是可以选择将值复制到另一个序列,但这不是我想做的。
编辑:我知道filter_iterator
,但过滤了值 - 它不会改变迭代进展的方式。
答案 0 :(得分:6)
答案 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会增加底层迭代器值两次就是你所需要的。