c++中unorder_map是如何解决冲突和扩容的?

558 阅读1分钟

在C++中,unordered_map 是使用哈希表实现的,它通常使用开放定址法(open addressing)解决哈希冲突,同时也会进行动态扩容来保持哈希表的性能。

  1. 解决冲突

    • 开放定址法是一种解决冲突的方法,它包括线性探测、二次探测和双重散列等技术。
    • unordered_map 中,默认使用线性探测法来解决冲突。当插入一个元素时,如果发生了哈希冲突,就会线性地探测下一个空槽位,直到找到一个空槽位或者达到最大探测次数为止。
    • 当探测到一个空槽位时,就会将元素插入到该位置。
  2. 动态扩容

    • unordered_map 在插入元素时会检查当前负载因子(load factor),即当前元素数量与容量的比值。如果负载因子超过了某个阈值(通常是0.75),就会触发扩容操作。
    • 扩容操作包括分配一个更大的内存空间,并将原有的元素重新哈希到新的内存空间中。
    • 扩容完成后,原有的内存空间会被释放,哈希表的容量变为新的大小,以提供更好的性能。

动态扩容和开放定址法的结合使得 unordered_map 能够高效地处理哈希冲突,并且在元素数量增加时保持良好的性能。