我尝试重用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?
答案 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);
}