为什么 unordered_map 由于“保留”而有足够的桶时会增加大小?

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)

Pat*_*RIA 3

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_countof1和一个max_load_factorof 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)

因此,在我看来,这种行为是正常的。