std::unordered_map如何区分同一桶中的键值对应?是否采用std::pair存储?
关于std::unordered_map的键值存储与碰撞查找问题
存储形式:确实用std::pair存储
std::unordered_map的每个元素确实是以std::pair<const Key, T>的形式存储的——键是const类型,保证不会被修改(因为哈希结构的稳定性依赖键的值,修改键会导致哈希定位失效)。每个桶内的链表节点,核心就是包含这个键值对的结构体,同时附带链表的前后指针(不同编译器实现细节可能有差异,但存储键值对是统一的核心逻辑)。
同一桶中匹配键的方式
当哈希碰撞导致多个键进入同一桶时,查找对应键值的过程是:
- 先计算目标键的哈希值,快速定位到对应的桶;
- 遍历该桶内的链表节点,逐个取出节点中存储的
std::pair的键; - 通过键的相等性比较(默认使用
==运算符,也支持用户自定义的相等判定函数),找到与目标键完全匹配的节点,该节点对应的pair的第二个元素就是要找的值。
简言之,哈希值只负责快速缩小查找范围(定位桶),最终确定键值对应关系的是键的直接相等比较——哈希是“粗定位”,键相等比较是“精准匹配”。
内容的提问来源于stack exchange,提问作者kngy
相关产品推荐
相关产品推荐

