关于std::unordered_map查找原理与内部存储的技术疑问
关于std::unordered_map的几个常见疑问解答
首先纠正一个细节:你遍历
std::unordered_map<Foo, Bar>时,迭代器指向的其实是std::pair<const Foo, Bar>(键是const的,不能修改),而std::unordered_map内部确实是以这种键值对的形式存储数据的,你的“误以为”其实是错的——它内部真的存的是这类pair对象。哈希只针对键(
Foo类型的部分),和值(Bar)完全无关。插入元素时,程序会先计算键的哈希值,把整个键值对放到对应的哈希桶里;查找时也是先根据目标键的哈希找到对应桶,再在桶内逐个比较键(用==运算符)来定位到具体的键值对,全程不需要碰值的部分。调用
begin()返回的迭代器,解引用后直接指向容器内部存储的键值对对象,不是临时创建的副本。所以你修改这个pair里的Bar部分(键是const的,没法改),自然会同步到std::unordered_map本身的数据里——因为你操作的就是容器里的原对象。
内容的提问来源于stack exchange,提问作者zantezuke
相关产品推荐
相关产品推荐

