如何在 C++ 中初始化一个空的无序映射?
How to initialize an empty unordered map in C++?
我必须在 C++ 中的无序映射上 运行 一个循环(t 上的循环),每次循环 运行,无序映射都会更新。但我想做的是,每次循环 运行 时都从一张空地图开始。如何初始化一个空的无序映射?
while (t--){
unordered_map<int, int> freq;
//perform various insertions and deletions in the map
//print all the elements in the map
}
无序映射在使用两个东西的意义上有点棘手:
- 一串 {key,value} 对(STL 使用
std::forward_list
)。
- 链元素的位置数组(散列table)。
当您向映射中插入元素时,数组会被填满(加载因子增加)并且散列冲突开始变得频繁。最终会调整该数组的大小,并重新创建其所有元素(对链的位置)(这称为重新散列)。
也就是说,您的代码完全符合您的要求:声明类型为 std::unordered_map<int,int>
的变量默认情况下对其进行初始化。当程序循环返回时,映射在下一次迭代(调用析构函数)之前超出范围,并在新迭代开始时初始化一个新变量。
但是,您可以考虑使用另一种替代方法:改为在循环开始时调用 clear()
,并在循环外声明地图:
std::unordered_map<int, int> freq;
while (t--) {
freq.clear();
// do something with freq
}
如果所有迭代都相似(您在 freq
中引入了相似数量的对),第一次迭代将 找到 适当大小的散列 table(重新散列),但随后的迭代不会经常看到这种效果:在 clear()
期间,我们擦除所有链的元素,但保留数组,它将在整个循环中重复使用。
我必须在 C++ 中的无序映射上 运行 一个循环(t 上的循环),每次循环 运行,无序映射都会更新。但我想做的是,每次循环 运行 时都从一张空地图开始。如何初始化一个空的无序映射?
while (t--){
unordered_map<int, int> freq;
//perform various insertions and deletions in the map
//print all the elements in the map
}
无序映射在使用两个东西的意义上有点棘手:
- 一串 {key,value} 对(STL 使用
std::forward_list
)。 - 链元素的位置数组(散列table)。
当您向映射中插入元素时,数组会被填满(加载因子增加)并且散列冲突开始变得频繁。最终会调整该数组的大小,并重新创建其所有元素(对链的位置)(这称为重新散列)。
也就是说,您的代码完全符合您的要求:声明类型为 std::unordered_map<int,int>
的变量默认情况下对其进行初始化。当程序循环返回时,映射在下一次迭代(调用析构函数)之前超出范围,并在新迭代开始时初始化一个新变量。
但是,您可以考虑使用另一种替代方法:改为在循环开始时调用 clear()
,并在循环外声明地图:
std::unordered_map<int, int> freq;
while (t--) {
freq.clear();
// do something with freq
}
如果所有迭代都相似(您在 freq
中引入了相似数量的对),第一次迭代将 找到 适当大小的散列 table(重新散列),但随后的迭代不会经常看到这种效果:在 clear()
期间,我们擦除所有链的元素,但保留数组,它将在整个循环中重复使用。