2

我尝试重用 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<_Tp, _Alloc>::rbegin() 中的 'operator=' 不匹配,_Tp = boost::shared_ptr, _Alloc = std::allocator >'</p>

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

4

2 回答 2

7

rbegin()返回 a reverse_iterator,它与普通的类型完全不同iterator

它们不能相互分配。

于 2012-09-26T15:23:19.563 回答
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);
}
于 2012-09-26T16:16:19.327 回答