Gol*_*ame 6 c++ unordered-map hashtable c++14
考虑这个代码。我为 unordered_map 保留 6 个点并插入 6 个元素。之后,有7个桶。为什么是这样?max_load_factor 为 1,并且有足够的存储桶用于我插入的元素数量。
#include <iostream>
#include <unordered_map>
using namespace std;
int main () {
unordered_map<std::string,std::string> mymap = {
{"house","maison"},
{"apple","pomme"},
{"tree","arbre"},
{"book","livre"},
{"door","porte"},
{"grapefruit","pamplemousse"}
};
unordered_map<std::string,std::string> mymap2; // THIS ONE!!!
mymap2.reserve(6);
for (auto i:mymap) {
mymap2[i.first] = i.second;
}
std::cout << "max_load factor " << mymap2.max_load_factor() << " mymap has " << mymap2.bucket_count() << " buckets.\n";
for (unsigned i=0; i<mymap2.bucket_count(); ++i) {
cout << "bucket #" << i << " contains: ";
for (auto it = mymap2.begin(i); it!=mymap2.end(i); ++it)
cout << "[" << it->first << ":" << it->second << "] ";
cout << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
max_load factor 1 mymap has 7 buckets.
bucket #0 contains:
bucket #1 contains: [book:livre]
bucket #2 contains: [tree:arbre]
bucket #3 contains: [house:maison] [grapefruit:pamplemousse]
bucket #4 contains:
bucket #5 contains: [door:porte]
bucket #6 contains: [apple:pomme]
Run Code Online (Sandbox Code Playgroud)
cplusplus.com 网站给出了这样的解释:
void reserve (size_type n);
Run Code Online (Sandbox Code Playgroud)
请求更改容量
将容器 ( ) 中的桶数设置
bucket_count
为最适合包含至少n 个元素。如果 n 大于当前值
bucket_count
乘以,则增加max_load_factor
容器的值并强制重新散列。bucket_count
如果 n 低于该值,该功能可能无效。
在声明unordered_map
变量时,它有一个bucket_count
of1
和一个max_load_factor
of 1
。然后你的reserve
6
桶大于max_load_factor
乘以bucket_count
根据这个定义,在我看来,这种行为是正确的。
我在您的代码行添加了17
以下行以显示bucket_count
之前的内容reserve
,事实上,它是1
std::cout << "BEFORE RESERVE max_load factor " << mymap2.max_load_factor() << " mymap has " << mymap2.bucket_count() << " buckets.\n";
Run Code Online (Sandbox Code Playgroud)
显示如下:
BEFORE RESERVE max_load factor 1 mymap has 1 buckets.
Run Code Online (Sandbox Code Playgroud)
预留后:
AFTER RESERVE max_load factor 1 mymap has 7 buckets.
Run Code Online (Sandbox Code Playgroud)
因此,在我看来,这种行为是正常的。