13

参考http://www.careercup.com/question?id=17188673 by chetan.j9

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);      
}

Question> 能不能把unordered_map的迭代器存起来供以后检索?根据我的理解,在插入或删除一个元素后,迭代器会失效。

谢谢

4

2 回答 2

22

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

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

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

(将其放在上下文中:第 23.2.5 节是关于无序关联容器的部分,因此它适用于、 和std::unordered_setstd::unordered_map)这意味着:std::unordered_multisetstd::unordered_multimap

  1. 如果你想插入n元素到被unordered_map调用的hash,你可以检查是否

     hash.size() + n < hash.max_load_factor() * hash.bucket_count()
    

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

  2. 即使迭代器在此操作中无效,对元素本身的引用也将保持有效。

  3. 如果您使用erase元素,则只有指向这些元素的迭代器才会失效;其他迭代器将保持有效。

于 2013-05-28T01:25:20.560 回答
7

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

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

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

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

于 2013-05-27T23:45:34.683 回答