在C++ STL中的unordered_set max_load_factor()
什么是unordered_set
在C++ STL中,unordered_set是一个集合容器,它存储不重复的元素,没有按照任何顺序存储它们。其内部实现使用哈希表,使得查找元素的速度非常快。
unordered_set与set的最大区别在于,unordered_set中的元素不是按照顺序来存储的,而set中的元素是有序的。
下面是一个示例代码,演示如何使用unordered_set:
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> my_set = {3, 1, 5, 7, 9};
// 使用迭代器访问unordered_set中的元素
for (auto it = my_set.begin(); it != my_set.end(); ++it)
std::cout << *it << " ";
// 检查unordered_set是否包含元素
if (my_set.find(5) != my_set.end())
std::cout << "5 is in my_set";
return 0;
}
在上面的代码中我们创建了一个名为my_set的unordered_set,它包含了5个整数(3, 1, 5, 7, 9)。接下来我们使用迭代器遍历my_set中的元素,并在其中搜索数字5。
max_load_factor()
unordered_set还提供了一个有用的函数max_load_factor()。
max_load_factor()函数是unordered_set用来控制哈希表负载因子的方法。负载因子是一个哈希表中已经存储的元素数与它的容量之比。当元素增加到哈希表中时,负载因子会增加,其大小直接影响到哈希表的性能。
max_load_factor()函数允许你设置一个负载因子的最大值。当unordered_set中元素数量较大时,负载因子超过设置的值会导致unordered_set自动重新哈希,从而重新分配桶和元素,保持哈希表的性能。
以下是示例代码,展示了如何使用max_load_factor()函数:
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> my_set = {1, 2, 3, 4, 5};
// 获取当前负载因子
std::cout << "Current load factor: " << my_set.load_factor() << std::endl;
// 修改最大负载因子为2.0
my_set.max_load_factor(2.0);
// 尝试插入一个新元素
my_set.insert(6);
// 输出最大负载因子
std::cout << "Max load factor: " << my_set.max_load_factor() << std::endl;
return 0;
}
在上面的代码中,我们首先创建了一个名为my_set的unordered_set,它包含了5个整数(1, 2, 3, 4, 5)。接着,我们使用load_factor()函数获取当前负载因子,并使用max_load_factor()函数将最大负载因子设置为2.0。
然后,我们尝试向my_set中插入一个新的元素6,并使用max_load_factor()函数输出最大负载因子。
max_load_factor()函数的默认值
如果未设置max_load_factor()函数,它的默认值是1.0。
这意味着unordered_set不会更改它分配的存储桶的数量,而是尽可能地填充当前桶。当unordered_set中的元素数量增加时,负载因子将达到1.0,此时unordered_set将自动为存储的元素重新分配桶和元素,使负载因子保持接近1.0。
以下是示例代码,演示了如何访问unordered_set的默认max_load_factor():
#include <iostream#include <unordered_set>
int main() {
std::unordered_set<int> my_set = {1, 2, 3, 4, 5};
// 获取当前负载因子和默认最大负载因子
std::cout << "Current load factor: " << my_set.load_factor() << std::endl;
std::cout << "Default max load factor: " << my_set.max_load_factor() << std::endl;
// 尝试插入一个新元素
my_set.insert(6);
// 输出最大负载因子
std::cout << "Max load factor: " << my_set.max_load_factor() << std::endl;
return 0;
}
在上面的代码中,我们创建一个名为my_set的unordered_set,它包含了5个整数(1, 2, 3, 4, 5)。然后我们使用load_factor()和max_load_factor()函数分别获取当前负载因子和默认最大负载因子。
接着,我们向my_set中插入一个新的元素6,并使用max_load_factor()函数输出最大负载因子。
总结
C++ STL中的unordered_set提供了一个高效的哈希表实现,使得在其中搜索元素的速度非常快。max_load_factor()函数是unordered_set用来控制哈希表负载因子的方法,允许你设置一个负载因子的最大值。如果未设置max_load_factor()函数,则它的默认值为1.0。在实际使用中,我们应该根据unordered_set中存储的元素数量和所需的性能,选择合适的负载因子和最大负载因子。