2013-06-21 63 views
0

嗨我不知道如果迭代器會改變,如果unordered_map的大小改變,然後rehashed?我試圖創建一個迭代器指針的結構,將unordered_map中的幾個元素放在一起。將unordered_map迭代器更改?

#include<string> 
#include<tr1/unordered_map> 

struct linker 
{ 
    unordered_map<Key,T>::iterator it; 
    unordered_map<Key,T>::iterator it1; 
    unordered_map<Key,T>::iterator it2; 

}; 

unordered_map<string,int> map({{"aaa",1},{"bbb",2},{"ccc",3},{"ddd",4}}); 

linker node1 = new linker; 
node1.it = map.find("aaa"); 
node1.it1 = &map.find("ccc"); 
node1.it2 = &map.find("ddd"); 

map.insert(make_pair({"sss",23})); 
..... 

插入太多元素後,迭代器指針是否仍然可用並在地圖大小更改之前指向相同的元素/鍵?

+0

我相信如果你的插入引起重新散列,所有的迭代器都將失效。 – GWW

+0

所以我應該創建一個結構來存儲將是字符串的鍵? – weeo

回答

2

C++ 11 23.2.5/8「無序關聯容器」:

重散列無效的迭代器,改變元件之間的排序,並且該剷鬥元素出現在變化,但並不否定指針或引用元素。

所以迭代器在rehash上會失效,但你可以引用元素來代替。

+0

所以也許我應該創建包含鍵類型(在這種情況下字符串)和結構指針到下一個結構的結構? – weeo

+0

想要這樣嗎? http://stackoverflow.com/questions/17223708/hybrid-linked-list-constructed-on-unordered-map/17224096?noredirect=1#17224096 – weeo

+0

看起來它應該工作。作爲一個方面說明,在標準(23.2.5/13)的後面,在討論insert()的作用時,沒有提到指針:「insert和emplace成員不應該影響對容器元素的引用的有效性,但可能會使所有迭代器都無效「。我不確定如果一個引用可以保持有效而沒有對象保留在同一地址,所以我認爲通過推斷,指針仍然有效。 –