unordered_map的扩容过程

unordered_map 是 C++ STL 中实现哈希表的一种容器,其扩容过程涉及到重新分配内存和重新哈希。以下是扩容过程的主要步骤:

1. 触发条件

  • unordered_map 中的元素数量超过当前桶(bucket)的容量时,扩容会被触发。通常,扩容的条件是负载因子(load factor)超过预设值(例如 1.0),负载因子是元素数量与桶数量的比值。

2. 计算新桶数量

  • 在扩容时,unordered_map 会根据当前的元素数量计算新的桶数量。新的桶数量通常是当前桶数量的两倍,确保在扩容后能够保持较低的负载因子。

3. 分配新内存

  • 为新的桶数组分配内存,新的桶数组的大小为计算出的新桶数量。

4. 重新哈希

  • 对于旧桶中的每个元素,使用新的桶数量重新计算哈希值并将元素移动到新桶。这个过程包括:
    • 遍历旧的桶数组。
    • 对每个非空桶中的元素,计算其新的桶索引。
    • 将元素插入到相应的新桶中。

5. 释放旧内存

  • 释放旧的桶数组的内存,以避免内存泄漏。

6. 更新内部状态

  • 更新 unordered_map 的内部状态,包括当前桶数量、元素数量和负载因子。

性能考虑

  • 扩容过程可能会导致性能下降,因为它涉及到重新分配和重新哈希。为了减少扩容频率,可以合理设置初始桶数量和负载因子。
#include <iostream>
#include <unordered_map>

int main() {
    // 创建一个 unordered_map
    std::unordered_map<int, std::string> myMap;

    // 插入元素
    for (int i = 0; i < 10; ++i) {
        myMap[i] = "Value " + std::to_string(i);
        std::cout << "Inserted: " << i << " -> " << myMap[i] << std::endl;
    }

    // 打印当前的桶数量
    std::cout << "Current bucket count: " << myMap.bucket_count() << std::endl;

    // 检查负载因子
    std::cout << "Current load factor: " << myMap.load_factor() << std::endl;

    // 继续插入以触发扩容
    for (int i = 10; i < 20; ++i) {
        myMap[i] = "Value " + std::to_string(i);
        std::cout << "Inserted: " << i << " -> " << myMap[i] << std::endl;
    }

    // 再次打印当前的桶数量
    std::cout << "New bucket count after insertions: " << myMap.bucket_count() << std::endl;

    return 0;
}

总结

unordered_map 的扩容过程是一个复杂但高效的过程,通过动态调整桶数量和重新分配元素,确保哈希表在多次插入操作后仍能保持良好的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值