2012-09-26 137 views
2

我嘗試重用STL迭代器,但找不到任何關於此的信息。在這段代碼有問題: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++) { 

但得到錯誤:

error: no match for ‘operator=’ in ‘poolbegin = std::vector<_Tp, _Alloc>::rbegin() with _Tp = boost::shared_ptr, _Alloc = std::allocator >’

有沒有辦法來迭代器重置爲新的價值?像shared_ptr :: reset?

+4

迭代和反向迭代器是不同的,不相關的類型。 –

回答

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); 
} 
7

rbegin()返回reverse_iterator,這是與正常的iterator完全不同的類型。

它們不能被分配給對方。