在C++中,unordered_map 是使用哈希表实现的,它通常使用开放定址法(open addressing)解决哈希冲突,同时也会进行动态扩容来保持哈希表的性能。
-
解决冲突:
- 开放定址法是一种解决冲突的方法,它包括线性探测、二次探测和双重散列等技术。
- 在
unordered_map中,默认使用线性探测法来解决冲突。当插入一个元素时,如果发生了哈希冲突,就会线性地探测下一个空槽位,直到找到一个空槽位或者达到最大探测次数为止。 - 当探测到一个空槽位时,就会将元素插入到该位置。
-
动态扩容:
unordered_map在插入元素时会检查当前负载因子(load factor),即当前元素数量与容量的比值。如果负载因子超过了某个阈值(通常是0.75),就会触发扩容操作。- 扩容操作包括分配一个更大的内存空间,并将原有的元素重新哈希到新的内存空间中。
- 扩容完成后,原有的内存空间会被释放,哈希表的容量变为新的大小,以提供更好的性能。
动态扩容和开放定址法的结合使得 unordered_map 能够高效地处理哈希冲突,并且在元素数量增加时保持良好的性能。