std::unordered_map指针/引用失效问题

23

我有以下代码:

std::unordered_map<std::string, std::string> map;

map["k1"] = "v1";
auto& v1 = map["k1"];
map["k2"] = "v2";

阅读https://en.cppreference.com/w/cpp/container/unordered_map#Notes后,我发现交换函数不会使容器中的任何迭代器失效,但它们确实会使标记交换区域结束的迭代器失效。即使相应的迭代器失效,对于存储在容器中的键或数据的引用和指针只有通过删除该元素才会无效。

看起来,即使在插入期间重新散列可能会发生,也可以安全地在插入新值后使用v1。 我对这句话的解释正确吗? 在修改map之后,我可以使用map中的值的引用/指针(显然,删除值本身将使引用/指针无效)?


3
没错,你说得对。这里也可以看到相关信息:链接 - Ami Tavory
1个回答

23
看起来在插入新值后,即使重新哈希可能发生在插入过程中,也可以安全地使用v1

是的,std::unordered_map::operator[]不会使引用失效,即使发生了重新哈希。

(强调是我的)

如果插入导致容器重新哈希,则所有迭代器都失效。否则,迭代器不受影响。但是引用不会失效

从标准的[unord.req]/9

(强调是我的)

重新哈希使迭代器无效,更改元素之间的顺序并更改元素出现的桶,但是不会使指向元素的指针或引用失效

如果发生重新哈希(由于插入操作),所有的迭代器和引用都会失效。 - Qingchuan Zhang
@QingchuanZhang 你是说我从cppreference.com和标准中引用的内容有误吗? - songyuanyao
我觉得它们是相互矛盾的,cppreference上说:“如果发生重新哈希(由于插入操作),所有迭代器和引用都会失效”,而标准上说:“重新哈希会使迭代器失效,改变元素之间的顺序,以及改变元素所在的桶,但不会使指向元素的指针或引用失效”。 - Qingchuan Zhang
@QingchuanZhang 标准总是正确的。cppreference.com只是一个基于维基的网站。 - songyuanyao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接