4

当密钥不存在时,unordered_multimap::bucket(key)应该返回什么?

参考资料说它应该返回包含密钥的桶的桶号,但没有说明当 unordered_multimap 中不存在该密钥时会发生什么。

我自己尝试过,但得到的结果不正确:

std::unordered_multimap<std::string, std::string> m = {{"jack", "foo"}, {"jill", "bar"}};
std::cout << "jack is in bucket " << m.bucket("jack") << std::endl;
std::cout << "jill is in bucket " << m.bucket("jill") << std::endl;
std::cout << "bjarne is in bucket " << m.bucket("bjarne") << std::endl;

输出是:

jack is in bucket 3
jill is in bucket 4
bjarne is in bucket 4

这是否意味着我必须使用 sayunordered_multimap::count(key) == 0来捕获不存在的键?

4

2 回答 2

4

它返回 key所属的桶的索引,无论是否插入了这样的 key。

来自标准(C++11,§23.2.5,表 103,第 752 页):

b.bucket(k)

k如果存在任何此类元素,则返回将在其中找到具有等效键的元素的桶的索引。

唯一的先决条件是b.bucket_count > 0(几乎总是如此)。理论上,unordered_multimap允许默认构造函数生成具有零桶的初始哈希,但我怀疑任何实现实际上都会这样做)。


要检查密钥是否存在(即已插入),请使用

b.count(key) > 0

正如你所建议的,或者

b.find(key) != b.end()

(我认为后者往往更有效,因为一般来说,检查是否存在比计数更容易。这在 . 中尤其如此unordered_multimap。)

于 2013-06-27T02:36:13.700 回答
1

阅读标准的表 103,bucket 的返回是,“如果存在任何这样的元素,将在其中找到具有与 k 等效的键的元素的桶的索引。” 因此,如果“bjarne”在多重地图中,那么他将在存储桶 4 中。

看起来你必须使用

unordered_multimap::count(key) == 0或者

unordered_multimap::find(k) == unordered_multimap::end()检查不存在的密钥。

于 2013-06-27T02:39:00.543 回答