在C ++中,unordered_maps与unordered_multimaps的底层存储和功能是什么?

时间:2015-09-26 19:31:15

标签: c++ hashmap hashtable unordered-map multimap

我很难把头包裹在unordered_maps和unordered_multimaps周围,因为我的测试代码并没有产生我所预期的结果。

std::unordered_map<string, int> names;

names.insert(std::make_pair("Peter", 4));

names.insert(std::make_pair("George", 4));

names.insert(std::make_pair("George", 4));

当我遍历这个列表时,我首先得到乔治的一个实例,然后是彼得。

1)我的理解是unordered_maps不允许多个键映射到一个值,并且那个multimaps到期了。这是真的吗?

2)彼得和乔治为什么能以4的价值共存?第二个乔治发生了什么事?就此而言,如果这是无序的,那么当我从begin()迭代到end()时,为什么George首先出现?

3)无序地图与无序多地图的基本表示是什么?

4)有没有办法在没有提供值的情况下将键插入任何一个地图?例如。让编译器创建自己的哈希函数,当我检索密钥并查找冲突时,我不需要担心?

2 个答案:

答案 0 :(得分:2)

我做得很简短:

  1. 否。多...指键。 (非多)地图不能具有带有不同值的多个等效键,即。每个键最多只有一个值。多地图可以。对于无序版本也是如此。
  2. Peter != George,这就是为什么他们有不同的密钥,并且很可能具有相同的价值。
  3. 散列图。
  4. 使用套装。
  5. 在您的示例中,使用(非多)George的第二次插入被跳过,因为之前插入了相同的密钥。

答案 1 :(得分:1)

你想使用unordered_multimap来拥有几个相同的键。

由于这是无序的,你真的不希望有任何特定的顺序,因为它取决于散列函数。

如果您想要插入内容的顺序,则需要使用std :: vector。即使是应该被排序的法线贴图也意味着比较顺序,而不是插入事物的顺序,例如字符串“AB”出现在“BB”之前,因为“A”小于“B”。

要在不提供值的情况下插入,您需要一个集合,而不是地图。

“无序”事物的基础结构是哈希表。