std::unordered_map的底层是怎么实现的
时间: 2023-06-04 20:05:45 浏览: 110
std::unordered_map是通过哈希表实现的。具体来说,在插入元素时,它会根据已经定义好的哈希函数将元素的键映射到哈希表的某个位置。如果发现该位置已被占用,则通过拉链法或开放地址法等方法在同一位置维护一个链表或查找另一个可用的位置。在查询元素时,则会使用相同的哈希函数找到对应的位置并查找链表中是否存在该元素。
相关问题
std::unordered_map底层实现
std::unordered_map 是 C++ STL 中的一个关联容器,它基于哈希表实现。底层实现主要包括哈希函数和冲突解决机制。
首先,std::unordered_map 使用一个哈希函数将键映射到桶(bucket)中。这个哈希函数可以是用户自定义的,也可以使用默认的 std::hash。哈希函数将键值转换为一个哈希码,然后通过取模运算将哈希码映射到桶中。
在每个桶中,一般存储一个链表或者链表的变种,用来解决哈希冲突。当两个不同的键映射到同一个桶时,就会产生冲突。std::unordered_map 使用链表或链表的变种(比如红黑树)来处理冲突,将具有相同哈希码的键值对存储在同一个桶中,并通过链表或树结构进行管理。
当需要插入或查找元素时,std::unordered_map 首先通过哈希函数计算键的哈希码,并根据哈希码找到对应的桶。然后,在该桶中遍历链表或树结构,找到需要的元素。
在 C++11 之后,std::unordered_map 还引入了桶分离和开放寻址两种解决冲突的方式。桶分离将每个桶实现为一个独立的链表或红黑树,从而减少了冲突时遍历的长度。开放寻址使用线性探测或二次探测的方式,将冲突的元素放在其他可用的桶中。
总的来说,std::unordered_map 的底层实现主要依赖于哈希函数和冲突解决机制,以实现高效的键值对存储和查找。
std::unordered_map相对于std::map的优势
`std::unordered_map` 是 C++ 标准库中的一种关联容器,它使用哈希表(Hash Table)作为底层数据结构,而 `std::map` 则是基于红黑树的实现。两者在功能上都是用来存储键值对,但它们在性能和适用场景上有所不同:
1. **查找速度**:`unordered_map` 的优势在于查找、插入和删除操作的时间复杂度通常为 O(1),如果哈希函数设计得当,能够快速定位到键对应的值。相比之下,`map` 的查找、插入和删除操作平均时间复杂度为 O(log n)。
2. **空间效率**:由于哈希表不保证元素有序,`unordered_map` 需要额外的空间来存储哈希表的桶和散列函数,可能会占用更多内存。而 `map` 可以利用红黑树的性质保持元素有序,所以内存占用相对较少。
3. **插入顺序**:`map` 会保持元素插入的顺序,如果插入顺序很重要,应该选择它。而 `unordered_map` 没有这个保证,元素的位置依赖于哈希值。
4. **随机访问**:如果你经常需要直接通过键获取值,且不需要保持元素顺序,那么 `unordered_map` 更适合。如果需要频繁进行范围查询或迭代操作,`map` 的有序性可能更有用。
5. **冲突处理**:`unordered_map` 使用哈希函数解决冲突,当两个键哈希到同一个位置时,会进行开放寻址或链地址法处理。`map` 则通过平衡二叉搜索树避免冲突,但可能会导致更高的复杂性。
阅读全文