std::unordered_map pointers/reference invalidation

你说的曾经没有我的故事 提交于 2019-11-30 02:11:12

问题


I have the following code:

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

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

After reading http://en.cppreference.com/w/cpp/container/unordered_map

Notes

The swap functions do not invalidate any of the iterators inside the container, but they do invalidate the iterator marking the end of the swap region.

References and pointers to either key or data stored in the container are only invalidated by erasing that element, even when the corresponding iterator is invalidated.

It looks like v1 can be safely used after inserting new values, even if re-hashing might occur during insertion.

Is my interpretation of this quote correct? May I use references/pointers of the values from the map after modifying the map (obviously erasing the value itself would invalidate the reference/pointer)?


回答1:


It looks like v1 can be safely used after inserting new values, even if re-hashing might occur during insertion.

Yes, std::unordered_map::operator[] doesn't invalidate references, even rehashing happens.

(emphasis mine)

If an insertion occurs and results in a rehashing of the container, all iterators are invalidated. Otherwise iterators are not affected. References are not invalidated.

From the standard, [unord.req]/9:

(emphasis mine)

Rehashing invalidates iterators, changes ordering between elements, and changes which buckets elements appear in, but does not invalidate pointers or references to elements.



来源:https://stackoverflow.com/questions/39868640/stdunordered-map-pointers-reference-invalidation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!