std :: unordered_map指针/引用失效

Mir*_*pas 11 c++ unordered-map language-lawyer c++11

我有以下代码:

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

map["k1"] = "v1";
auto& v1 = map["k1"];
map["k2"] = "v2";
Run Code Online (Sandbox Code Playgroud)

阅读http://en.cppreference.com/w/cpp/container/unordered_map后

笔记

交换函数不会使容器内的任何迭代器无效,但它们会使标记交换区域末尾的迭代器无效.

存储在容器中的键或数据的引用和指针只有通过擦除该元素才会失效,即使相应的迭代器无效也是如此.

v1即使在插入过程中可能发生重新散列,看起来在插入新值后也可以安全使用.

我对这句话的解释是否正确?我可以在修改地图后使用地图中值的引用/指针(显然擦除值本身会使引用/指针无效)?

son*_*yao 9

v1即使在插入过程中可能发生重新散列,看起来在插入新值后也可以安全使用.

是的,std :: unordered_map :: operator []不会使引用无效,甚至会发生rehashing.

(强调我的)

如果发生插入并导致重新散列容器,则所有迭代器都将失效.否则迭代器不会受到影响.引用不会失效.

从标准的$ 23.2.6/9无序关联容器[unord.req]:

(强调我的)

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