unordered_map 迭代器会改变吗?

Posted

技术标签:

【中文标题】unordered_map 迭代器会改变吗?【英文标题】:will unordered_map iterator change? 【发布时间】:2013-06-21 18:12:21 【问题描述】:

您好,我想知道如果 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));
.....

插入太多元素后,迭代器指针是否仍然可用并在映射大小更改之前指向相同的元素/键?

【问题讨论】:

我相信如果您的插入导致重新散列,所有迭代器都将失效。 所以我应该创建一个结构来存储字符串的键? 【参考方案1】:

C++11 23.2.5/8“无序关联容器”:

重新散列使迭代器无效、更改元素之间的顺序以及更改元素出现在哪些桶中,但不会使指针或元素引用无效。

所以迭代器会在重新散列时失效,但您可以改为引用元素。

【讨论】:

所以也许我应该创建包含键类型(在本例中为字符串)和指向下一个结构的结构指针的结构? 喜欢这个? ***.com/questions/17223708/… 看起来应该可以了。作为旁注,稍后在标准 (23.2.5/13) 中,在谈论 insert() 所做的事情时没有提到指针:“insert 和 emplace 成员不应影响对容器元素的引用的有效性,但可能使容器的所有迭代器无效”。我不确定如何在对象保持在同一地址的情况下保持引用有效,因此我认为指针通过推理仍然有效。

以上是关于unordered_map 迭代器会改变吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL 相关 部分笔记

为啥允许 std::unordered_map::rehash() 使迭代器无效?

指定构造 boost::unordered_map 时的最小桶数

为啥我不能增加 std::unordered_map 迭代器?

迭代 unordered_map 的复杂性是啥

unordered_map 迭代器指向 end(),如何从 unordered_map 中检索键?