C++ 跳过迭代器

C++ 跳过迭代器,c++,boost,stl,boost-iterators,C++,Boost,Stl,Boost Iterators,我有一个值序列,我想传递给一个函数,该函数采用(迭代器开始,迭代器结束)对。但是,我只希望处理原始序列中的第二个元素 使用标准Lib/Boost创建迭代器facade是否有一种好方法,可以让我按原始顺序传递?我想像这样简单的东西已经存在于boost迭代器或范围库中,但我没有找到任何东西 还是我错过了另一个显而易见的方法?当然,我知道我总是可以选择将值复制到另一个序列,但这不是我想要做的 编辑:我知道关于过滤器迭代器的事,但它会根据值进行过滤-它不会改变迭代的推进方式。下面是Boost的建议。这正

我有一个值序列,我想传递给一个函数,该函数采用
(迭代器开始,迭代器结束)
对。但是,我只希望处理原始序列中的第二个元素

使用标准Lib/Boost创建迭代器facade是否有一种好方法,可以让我按原始顺序传递?我想像这样简单的东西已经存在于boost迭代器或范围库中,但我没有找到任何东西

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

编辑:我知道关于
过滤器迭代器的事,但它会根据值进行过滤-它不会改变迭代的推进方式。

下面是Boost的建议。这正是你想要的

更新:对不起,读错了。下面是Boost中所有迭代器有趣之处的列表:

我认为您只需要一个普通的迭代器适配器,它带有一个重载的
运算符+++
,将基础迭代器值增加两倍。

struct TrueOnEven{
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));
}
模板 bool运算符()(常量T&{return mCount++%2==0;} TrueOnEven():mCount(0){} 私人: 国际计数; }; int main(){ std::vectortVec,tOtherVec; ... typedef boost::filter_迭代器TakeEvenFilterType; 标准::副本( TakeEvenFilterType(tVec.begin(),tVec.end()), TakeEvenFilterType(tVec.end(),tVec.end()), 标准:背部插入器(tOtherVec); }
老实说,这不是好的和直观的。我编写了一个简单的“枚举器”库,其中包含惰性集成查询,以避免像上面那样的混乱。。它允许您编写:

Query::From(tVec.begin(), tVec.end())
.Skip<2>()
.ToStlSequence(std::back_inserter(tOtherVec));
Query::From(tVec.begin(),tVec.end())
.Skip()
.ToStlSequence(std::back_inserter(tOtherVec));
其中,
Skip
基本上实例化了一个通用的“过滤器”,它每N个(在本例中是每秒)元素跳过一次

干杯


Paul

我想你想

Ia在同一主题上问了一个稍微不同的问题:,bt我特别要求没有提升,那不是很有帮助:(不,不是。过滤器迭代器用一个值谓词过滤序列-但是我想在迭代器上有一个谓词(如果你想把它看作是过滤的话)。基本上,我只想将
+=2
作为
+
呈现给我的内部操作符。问题是,(在实现中)两次应用操作符++可以超过容器的末尾,而不检查跳过的元素是否已经是end()迭代器。尽管我在考虑for循环(skip_iterator it=v.begin());it!=v.end();++it){}alfC:在第二次调用unling迭代器的
operator++
@rubenvb之前,您需要检查
it!=end
是否在
操作符+++
中。但是在这种情况下,迭代器必须在内部了解
end
。是否将end作为迭代器的一部分,您是否将其传递到
中>下一个
++
)函数?在任何情况下,这在迭代器是什么的上下文中都没有任何意义。+1用于识别这只是一个愚蠢的攻击。它还对内部算法如何使用迭代器以及
过滤器迭代器
如何使用谓词做出了许多假设。例如,if
操作符()对于给定的迭代器,
被计算两次,所有内容都不同步。严格来说,如果过滤器迭代器分类为除
std::input\u迭代器
boost::SinglePass
之外的任何内容,那么您可能应该编写一个完整的
跳过迭代器
,这看起来可能更难。。。