我有以下代码:
std::unordered_map<std::string, std::string> map;
map["k1"] = "v1";
auto& v1 = map["k1"];
map["k2"] = "v2";
阅读http://en.cppreference.com/w/cpp/container/unordered_map
后注释
交换函数不会使容器内的任何迭代器无效,但它们会使标记交换区域末尾的迭代器无效。
存储在容器中的键或数据的引用和指针只有通过擦除该元素才会失效,即使相应的迭代器无效也是如此。
在插入新值后,即使在插入过程中可能会发生重新散列,也可以安全地使用v1
。
我对这句话的解释是否正确?我可以在修改地图后使用地图中值的引用/指针(显然擦除值本身会使引用/指针无效)?
答案 0 :(得分:8)
在插入新值后,即使在插入过程中可能会发生重新散列,也可以安全地使用
v1
。
是的,std::unordered_map::operator[]不会使引用无效,甚至会发生重新发生。
(强调我的)
如果发生插入并导致容器重新散列,则所有迭代器都将失效。否则迭代器不会受到影响。 引用不会失效。
从标准$23.2.6/9 Unordered associative containers [unord.req]:
开始(强调我的)
Rehashing使迭代器无效,元素之间的顺序更改以及桶元素出现的更改,但不会使指针或对元素的引用失效。