当key不存在时,返回unordered_multimap :: bucket()的值?

时间:2013-06-27 01:37:00

标签: c++ c++11 stl

当密钥不存在时,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来捕获不存在的密钥?

2 个答案:

答案 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()检查不存在的密钥。