2013-01-08 69 views
3

這個問題,我似乎相當了學術興趣比實際用例組成:迭代器的STL容器如何表現?

STL的關聯容器,即[多]設置和[多]地圖,包含重載的方法,如:

// for std::map 
void erase (iterator position); 
size_type erase (const key_type& x); 

// for std::set 
iterator erase (const_iterator position); 
size_type erase (const value_type& val); 

我的問題:如果key_type,resp。 value_typeiteratorconst_iterator

我知道這是危險的,可能無用的將迭代器存儲在容器中。但是,實際的STL實現將如何表現?行爲是否定義了?

+3

存儲迭代器不是無用的。 –

+1

@眼鏡:grmph ...不......它在午餐時間出現......這可能是合理的嘗試。但是,這仍然會產生一個問題,無論我得到的行爲是否是隨意的或隨意的。 – steffen

+0

@LukeB。真的......但我想指出,實際上使用這種結構並不是我關心的問題。 – steffen

回答

10

問題是迭代器類型會有所不同。它不可能發生,他們是相同的。究其原因:下面的等式不得不在這種情況下舉行:

map<K, V>::iterator == K 
map<K, V>::const_iterator == K 

然而,這些等式不能抱(你看到遞歸)?請記住,迭代器類型取決於容器類型,包括其模板參數。

所以在下面的例子中,密鑰類型和迭代器類型是不同的,就像你試圖使他們平等:

map<map<int,int>::iterator, int> i; 

事實上,因爲上面的原因,我不能實例化一個關鍵字等於其迭代器類型的映射。因此,重載erase方法是這樣的:

void erase (map<map<int,int>::iterator, int>::iterator position); 
size_type erase (const map<int,int>::iterator & x); 

所以超載絕不會含糊。如果類型相同,則不明確,請參閱:http://ideone.com/fMdwru。但是,只要您使用該方法,編譯器只會抱怨。所以,假設我們可以在這裏引入歧義,只要我們想使用這個方法,它就會困擾我們。我的意思是,我們仍然可以實例化地圖類型(如果存在)。

+3

答案與你的用戶名和你的頭像完全一致! – steffen

+0

@steffen哦,你是對的,沒有意識到:) – leemes

6

將迭代器存儲在容器中沒有任何內在的錯誤。需要注意的兩個主要問題是:

  1. 您可能需要知道每個迭代器引用哪個容器;
  2. 您必須知道原始容器上的哪些操作會使哪些迭代器無效。

我的問題:如果key_type,RESP。 value_typeiteratorconst_iterator

如果所有四種類型引用相同的容器類型,答案是它們不能相同,根據定義。

0

這樣做沒有問題,也不是無用的。 :)

記住,迭代器基本上只是泛化指針。如果有疑問,假設他們的行爲像指針。你可以創建指針的容器,所以你也可以創建迭代器的容器。

當然,你必須記住,如果你修改一個容器,指向該容器的迭代器可能會失效(取決於所執行的操作和容器類型),但這只是意味着你必須知道存儲的迭代器保持有效。

+0

仍然沒有以任何方式解決實際問題,是嗎? –

+0

@ChristianRau我不會發布它,如果我沒有想到它的確如此。你覺得它沒有解決什麼問題? – jalf

+0

好吧,它回答了在容器中存儲迭代器的一般問題,但這只是實際問題的副產品,如果使用'key/value_type' =='(const_)迭代器,那麼給定函數會發生什麼?使用迭代器創建地圖的更具體的問題。 –