22.STL中hash table扩容发生什么?

发布时间 2023-08-03 07:27:00作者: CodeMagicianT

22.STL中hash table扩容发生什么?

在 C++ STL 中,std::unordered_mapstd::unordered_set 是两个使用哈希表 (hash table) 作为其底层实现的容器。

当哈希表的元素数量增长到某个阈值时,就需要进行扩容。这个阈值通常是哈希表容量(bucket count)和装载因子(load factor)的乘积。装载因子是一个浮点数,它决定了哈希表元素数与容量之间的比例。默认装载因子通常是1.0。

当需要扩容时,STL会执行以下步骤:

1.创建一个新的、更大的哈希表。新的大小通常是原来大小的两倍。

2.遍历原有哈希表中的所有元素,并重新计算它们在新哈希表中的位置(这个位置由元素的哈希值和新的哈希表大小决定)。

3.将每个元素从旧的哈希表移动到新的哈希表的对应位置。

这个过程被称为 rehashing。这是一个相当消耗资源的操作,因为它涉及到重新计算每个元素的哈希值,并可能涉及到大量的内存操作。但是,通过这种方式,可以保证哈希表的性能,因为它能保证元素在哈希表中的分布更均匀,减少哈希冲突,提高查找效率。

注意,虽然扩容可以提高哈希表的性能,但是频繁的扩容操作会消耗大量的资源,影响程序的性能。因此,如果你预先知道哈希表需要存储大量的元素,可以通过 rehashreserve 方法预先分配足够的空间,避免频繁的扩容操作。