关于C++中STL容器的问题

eag*_*101 3 c++ stl unordered-map multimap c++11

  1. std :: multimap和std :: unordered_multimap多久会有一次shuffle条目?我问,因为我的代码传递引用以区分具有相同哈希的条目,并且我想知道何时对它们运行引用重定向功能.

  2. 如果我这样做会发生什么:

    std::multimap atable; //Type specification stuff left out
    //Code that pus in two entries with the same key, call that key foo
    int bar = atable[foo];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果它是unordered_multimap,结果会有所不同吗?

  4. 返回传递引用以区分具有相同哈希的条目.有更安全的方法吗?

  5. 如果我删除其中一个条目,这些条目是否会移动(这是读取std :: vector文档的建议)?

Tem*_*Rex 5

不,任何操作过程中都不会损坏任何元素.

正如在这个着名的问答中解释的那样,对于关联容器,插入/擦除时没有迭代器失效(除了当然要擦除的元素).对于无序的关联容器,在重新散列期间存在迭代器失效,标准说明了这一点(强调我的)

23.2.5无序关联容器[unord.req]

9无序关联容器的元素被组织成桶.具有相同哈希码的密钥出现在同一个存储桶中.当元素添加到无序关联容器时,桶的数量会自动增加,因此每个桶的平均元素数量保持在一个边界之下.重新散列使迭代器无效,元素之间的顺序更改以及桶元素出现的更改,但不会使指针或对元素的引用无效.对于unordered_multiset和unordered_multimap,rehashing保留了等效元素的相对顺序.

同样,这并不需要重新填充实际存储的元素(KeyValue类型unordered_map<Key, Value>),因为无序映射具有组织为链表的存储区,存储元素的迭代器(键值对)具有元素指针和斗指针.reshshing shuffles buckets,它使迭代器无效(因为它们的bucket指针无效),但没有指针或对元素本身的引用.这在另一个问答中有详细解释