c++中unordered_maps与unordered_multimaps的底层存储和功能

Underlying storage and functionality of unordered_maps vs unordered_multimaps in C++?

本文关键字:unordered 存储 功能 multimaps maps c++      更新时间:2023-10-16

我很难理解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));

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

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

2)为什么Peter和George可以在值为4时共存?第二个乔治发生了什么事?对于这个问题,如果这是无序的,为什么当我从begin()迭代到end()时,George首先出现?

3)无序映射和无序multimap的底层表示是什么?

4)是否有一种方法可以在不提供值的情况下将键插入到映射中?例如,编译器创建自己的哈希函数,我不需要担心当我检索键和寻找碰撞?

我尽量短一点:

  1. 。多……指键。一个(非多)映射不能有多个具有不同值的等价键。每个键最多有一个值。一个多地图可以。对于无序的版本也是如此。
  2. Peter != George,这就是为什么它们有不同的键,可能有相同的值。
  3. hashmap。
  4. 使用集。

在您的示例中,使用(非多)键对George的第二次插入将被跳过,因为之前插入了相同的键。

您希望使用unordered_multimap拥有多个相同的键。

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

如果你想要插入东西的顺序,你需要使用std::vector。即使是法线映射,它应该是有序的,也意味着比较顺序,而不是你插入事物的顺序,例如字符串"AB"出现在"BB"之前,因为"A"小于"B"。

要插入而不提供值,需要一个set,而不是map。

"unordered_"的底层结构是哈希表