22.STL中hash table扩容发生什么?
22.STL中hash table扩容发生什么?
在 C++ STL 中,std::unordered_map
和 std::unordered_set
是两个使用哈希表 (hash table) 作为其底层实现的容器。
当哈希表的元素数量增长到某个阈值时,就需要进行扩容。这个阈值通常是哈希表容量(bucket count)和装载因子(load factor)的乘积。装载因子是一个浮点数,它决定了哈希表元素数与容量之间的比例。默认装载因子通常是1.0。
当需要扩容时,STL会执行以下步骤:
1.创建一个新的、更大的哈希表。新的大小通常是原来大小的两倍。
2.遍历原有哈希表中的所有元素,并重新计算它们在新哈希表中的位置(这个位置由元素的哈希值和新的哈希表大小决定)。
3.将每个元素从旧的哈希表移动到新的哈希表的对应位置。
这个过程被称为 rehashing。这是一个相当消耗资源的操作,因为它涉及到重新计算每个元素的哈希值,并可能涉及到大量的内存操作。但是,通过这种方式,可以保证哈希表的性能,因为它能保证元素在哈希表中的分布更均匀,减少哈希冲突,提高查找效率。
注意,虽然扩容可以提高哈希表的性能,但是频繁的扩容操作会消耗大量的资源,影响程序的性能。因此,如果你预先知道哈希表需要存储大量的元素,可以通过 rehash
或 reserve
方法预先分配足够的空间,避免频繁的扩容操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)