unordered_map 与水桶相撞

unordered_map collision with buckets

我正在使用 C++11 中的 unordered_map 库,我对存储桶的工作方式有些困惑。根据 cplusplus 网站上的文档,我很清楚它们并不像我想象的那样工作。

我希望我的密钥对中的密钥会散列到同一个桶中。例如:

#include <iostream>
#include <unordered_map>

using namespace std;

int main() {
  unordered_map<string, string> map;
  map.emplace("abc", "bca");
  map.emplace("abc", "bac");
  cout << map.bucket_size(map.bucket("abc")) << endl;
  cout << map.bucket_count() << endl;
  return 0;
}

我的预期是输出是

2
1

然而,它是

1
2

我知道输出的结果比我的预期理想得多,目标是尽可能少的链接,但出于我的目的,我希望发生这种链接和碰撞,以便我可以进行计算我需要为我的程序。我是否缺少完成此操作的步骤?

出现了一些情况 - 一个是您将同一个密钥输入两次。最终发生的是第二个 emplace 实际上失败了,因为对于任何地图数据结构,每个键只能获得一个值。如果您查看,您会发现包含 "abc" 的存储桶具有 "bca" 的值。

至于 bucket_count,不能保证它是任何特定值,并且很可能是实现定义的。例如,它可能是您的实现总是至少创建 2 个存储桶(如果它创建的话)。在决定丢弃该项目之前,它还可以在插入第二个项目时创建第二个存储桶。