当密钥不存在时,unordered_multimap::bucket(key)
应该返回什么?
引用说它应该返回包含密钥的存储桶的存储桶编号,但是当unordered_multimap中不存在该密钥时,没有任何说明。
I tried it myself但我得到的结果不正确:
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
这是否意味着我必须使用说unordered_multimap::count(key) == 0
来捕获不存在的密钥?
答案 0 :(得分:4)
它返回键所属的桶的索引,无论是否插入了这样的键。
从标准(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
中尤其如此。)
答案 1 :(得分:1)
读取表103的标准桶的返回值是“桶的索引” 如果存在任何这样的元素,那么将找到具有等于k的键的元素。“因此,如果”bjarne“在多图中,那么他将在第4桶中。
看起来你必须使用
unordered_multimap::count(key) == 0
或
unordered_multimap::find(k) == unordered_multimap::end()
检查不存在的密钥。