2013-06-21 67 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成员不应该影响对容器元素的引用的有效性,但可能会使所有迭代器都无效“。我不确定如果一个引用可以保持有效而没有对象保留在同一地址,所以我认为通过推断,指针仍然有效。 –