我们可以存储unordered_map <t> :: iterator吗?</t>

时间:2013-05-27 23:41:20

标签: c++

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的迭代器以供以后检索吗?根据我的理解,插入或删除元素后迭代器将失效。

谢谢

2 个答案:

答案 0 :(得分:18)

@ syam的回答是正确的(+1),但我认为引用唯一的权威来源C ++ 11标准是有用的:

  

(§23.2.5/ 13)insertemplace成员不应影响对容器元素的引用的有效性,但可能使容器的所有迭代器无效。擦除成员只能使迭代器和对擦除元素的引用无效。

     

(§23.2.5/ 14)如果(N + n)<1,则insertemplace成员不应影响迭代器的有效性。 z * B,其中N是插入操作之前容器中元素的数量,n是插入的元素数,B是容器的桶数,z是容器的最大负载因子。

(将其置于上下文中:§23.2.5是关于无序关联容器的部分,因此它适用于std::unordered_setstd::unordered_mapstd::unordered_multisetstd::unordered_multimap。 ) 这意味着:

  1. 如果您想将n元素插入名为unordered_map的{​​{1}},您可以检查是否

    hash

    是真的。如果为false,则在插入期间所有迭代器都将失效。如果为true,则迭代器将保持有效。

  2. 即使在此操作中迭代器无效,引用到元素本身仍然有效。

  3. 如果是hash.size() + n < hash.max_load_factor() * hash.bucket_count() 元素,则只有指向这些元素的迭代器才会失效;其他迭代器仍然有效。

答案 1 :(得分:6)

仅当发生重新散列时(即,如果新元素数大于或等于max_load_factor()*bucket_count()),插入项将使所有迭代器无效。否则,没有迭代器失效。

删除项目只会使删除元素的迭代器无效,而不会使其他无关元素无效。

来源:std::unordered_map::insertstd::unordered_map::erase

当然,这些规则仅适用于std::unordered_map。其他容器可能有不同的失效规则,您可以在文档中查找。