📜  C++ STL中的unordered_map load_factor(1)

📅  最后修改于: 2023-12-03 15:29:51.033000             🧑  作者: Mango

C++ STL中的unordered_map load_factor

在C++ STL(标准模板库)中,unordered_map是一个哈希表(unordered associative container)的实现,它的查找和插入操作平均时间复杂度为O(1)。unordered_map内部实现了一些策略来提高哈希表的效率,其中一个非常重要的参数就是load_factor

什么是load_factor

load_factor即是负载因子,是一个浮点数,表示哈希表中实际元素的个数和桶(bucket)数的比值。当load_factor超过某个阈值时(默认值为1.0),哈希表就需要重新分配更大的空间,以减少碰撞(collision)的概率并保持平均复杂度为常数。

如何设置load_factor

在创建unordered_map的时候,可以通过构造函数或reserve()函数来设置桶的数量,并在max_load_factor()函数中设置load_factor的最大值。例如:

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, std::string> map;

    map.reserve(100);                   // 设置桶的数量为100
    map.max_load_factor(0.5);           // 设置load_factor的最大值为0.5

    // 插入元素
    for (int i = 0; i < 50; ++i) {
        map[i] = std::to_string(i) + "th element";
    }

    std::cout << "当前桶的数量为:" << map.bucket_count() << std::endl;
    std::cout << "当前元素个数为:" << map.size() << std::endl;
    std::cout << "当前load_factor为:" << map.load_factor() << std::endl;

    return 0;
}

在上述示例中,我们通过reserve()函数将桶的数量设置为100,并使用max_load_factor()函数将load_factor的最大值设置为0.5。插入50个元素后,程序输出的结果如下:

当前桶的数量为:193
当前元素个数为:50
当前load_factor为:0.259067

可以看到,哈希表的实际桶数量为193,远大于预留的100个,但由于元素个数较少,load_factor的值只有0.26,也没有超过最大值0.5。

总结

unordered_map是C++ STL中的一个高效哈希表实现,通过调整load_factor和桶的数量,可以使哈希表的性能得到最大化的发挥。在实际应用中,建议根据具体情况灵活设置load_factor值和桶的数量。