2011-10-13 36 views
15

如何從C++中的iterator獲取const_iterator?來自insert_iterator怎麼樣?由此產生的iterator應該指向原來的位置。C++迭代器到const_iterator

+0

鑄造不起作用? – Pubby

+1

@ Pubby8:甚至不需要演員! –

+0

呵呵,我一定搞不清楚了。當我嘗試隱式轉換它們時,我認爲出現了編譯器錯誤。 –

回答

22

容器須提供iterator的類型轉換爲const_iterator,這樣你就可以隱式轉換:

Container::iterator it = /* blah */; 
Container::const_iterator cit = it; 

std::insert_iterator s爲輸出迭代器。這沒有辦法將它們轉換爲常規Container::iterator,它必須是前向迭代器。

另一種插入迭代器可能允許這樣的事情,但那些從標準函數中獲得的不是。

我想你可以圍繞編寫您自己的包裝std::insert_iterator暴露出保護成員iter,雖然:

template <typename Container> 
class exposing_insert_iterator : public std::insert_iterator<Container> { 
public: 
    exposing_insert_iterator(std::insert_iterator<Container> it) 
    : std::insert_iterator<Container>(it) {} 
    typename Container::iterator get_iterator() const { 
     return std::insert_iterator<Container>::iter; 
    } 
}; 

// ... 
std::insert_iterator<Container> ins_it; 
exposing_insert_iterator<Container> exp_it = ins_it; 
Container::iterator it = exp_it.get_iterator(); 
4

你可以將它們轉換。例如:

std::vector<int> v; 
std::vector<int>::iterator it = v.begin(); 
std::vector<int>::const_iterator cit = it; 

但我想這不是你正在尋找的答案。給我看代碼。 :-)