STL迭代器重置

时间:2012-09-26 15:21:01

标签: c++ stl iterator

我尝试重用STL迭代器,但找不到任何关于此的信息。这段代码有问题:

    std::vector< boost::shared_ptr<Connection> >::iterator poolbegin = pool.begin();
std::vector< boost::shared_ptr<Connection> >::iterator poolend = pool.end();
if( order ) {
    poolbegin = pool.rbegin(); // Here compilation fails
    poolend   = pool.rend();
}
    for( std::vector< boost::shared_ptr<Connection> >::iterator it = poolbegin; it<poolend; it++) {

但是得到错误:

  

错误:'poolbegin = std :: vector&lt; _Tp中的'operator ='不匹配,   _Alloc&gt; :: rbegin()_Tp = boost :: shared_ptr,_Alloc = std :: allocator&gt;'

有没有办法将迭代器重置为新值?像shared_ptr :: reset?

2 个答案:

答案 0 :(得分:7)

rbegin()会返回reverse_iterator,这是与普通iterator完全不同的类型。

他们不能互相分配。

答案 1 :(得分:1)

看起来你想要一个向前或向后通过向量的循环,具体取决于某些条件。

这样做的一种方法是将循环体分解为仿函数(如果你有C ++ 11,则将lambda分解)。

struct LoopBody {
  void operator()(boost::shared_ptr<Connection> connection) {
    // do something with the connection
  }
  // If the loop body needs to be stateful, you can add a constructor
  // that sets the initial state in member variables.
};

现在,您可以选择两种方式来完成循环:

LoopBody loop_body;
if (reverse_order) {
  std::for_each(pool.rbegin(), pool.rend(), loop_body);
} else {
  std::for_each(pool.begin(), pool.end(), loop_body);
}