chetan.j9参考http://www.careercup.com/question?id=17188673
void Insert( string s ) {
if( IsElementPresent(s) )
return;
myMap[s] = myMapVector.size();
unordered_map<string,int>::iterator it = myMap.find(s);
myMapVector.push_back(it);
}
问题&GT;我们可以存储unordered_map的迭代器以供以后检索吗?根据我的理解,插入或删除元素后迭代器将失效。
谢谢
答案 0 :(得分:18)
@ syam的回答是正确的(+1),但我认为引用唯一的权威来源C ++ 11标准是有用的:
(§23.2.5/ 13)
insert
和emplace
成员不应影响对容器元素的引用的有效性,但可能使容器的所有迭代器无效。擦除成员只能使迭代器和对擦除元素的引用无效。(§23.2.5/ 14)如果(N + n)<1,则
insert
和emplace
成员不应影响迭代器的有效性。 z * B,其中N是插入操作之前容器中元素的数量,n是插入的元素数,B是容器的桶数,z是容器的最大负载因子。
(将其置于上下文中:§23.2.5是关于无序关联容器的部分,因此它适用于std::unordered_set
,std::unordered_map
,std::unordered_multiset
和std::unordered_multimap
。 )
这意味着:
如果您想将n
元素插入名为unordered_map
的{{1}},您可以检查是否
hash
是真的。如果为false,则在插入期间所有迭代器都将失效。如果为true,则迭代器将保持有效。
即使在此操作中迭代器无效,引用到元素本身仍然有效。
如果是hash.size() + n < hash.max_load_factor() * hash.bucket_count()
元素,则只有指向这些元素的迭代器才会失效;其他迭代器仍然有效。
答案 1 :(得分:6)
仅当发生重新散列时(即,如果新元素数大于或等于max_load_factor()*bucket_count()
),插入项将使所有迭代器无效。否则,没有迭代器失效。
删除项目只会使删除元素的迭代器无效,而不会使其他无关元素无效。
来源:std::unordered_map::insert
和std::unordered_map::erase
。
当然,这些规则仅适用于std::unordered_map
。其他容器可能有不同的失效规则,您可以在文档中查找。