我有一系列值,我想传递给一个需要的函数 (iterator begin, iterator end)
对。但是,我只希望处理原始序列中的每个第二个元素。
有没有一种很好的方法使用Standard-Lib / Boost创建一个迭代器外观,允许我传入原始序列?我认为这样的简单事情已经在boost迭代器或范围库中,但我没有找到任何东西。
或者我错过了另一个完全明显的方法来做到这一点?当然,我知道我总是可以选择将值复制到另一个序列,但这不是我想要做的。
编辑: 我知道 filter_iterator
,但过滤值 - 它不会改变迭代的进展方式。
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个(在这种情况下每秒)元素......
干杯,
保罗
这是Boost的 过滤迭代器。这正是你想要的。
更新: 对不起,读错了。这是Boost中所有迭代器funkiness的列表:
http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/#specialized-adaptors
我认为一个带有重载的普通iterator_adaptor operator++
只需增加底层迭代器值两次即可。