【问题标题】:Underlying storage and functionality of unordered_maps vs unordered_multimaps in C++?C++ 中 unordered_maps 与 unordered_multimaps 的底层存储和功能?
【发布时间】:2015-09-26 19:31:14
【问题描述】:

我很难理解 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 不允许多个键映射到一个值,并且多映射到期。这是真的吗?

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

3) 无序映射与无序多映射的底层表示是什么?

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

【问题讨论】:

  • 我认为你应该阅读更多关于映射与集合的内容,将映射键映射到值,集合,然而,只存储东西。
  • 地图不允许重复键,而多地图允许。两者都不关心是否有重复的值 - 只有键很重要。他们通常甚至不知道如何比较值 - 您可以将一个类作为未定义 operator==operator&lt; 的值。

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


【解决方案1】:

我会简短地说:

  1. 没有。 Multi... 指的是键。 (非多)映射不能有多个具有不同值的等效键,即。每个键最多有一个值。多图可以。无序版本也是如此。
  2. Peter != George,这就是为什么它们有不同的键并且很可能具有相同的值。
  3. 哈希图。
  4. 使用集合。

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

【讨论】:

【解决方案2】:

您想使用 unordered_multimap 来拥有多个相同的键。

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

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

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

“unordered_”事物的底层结构是hashtable。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多