【问题标题】:When should I use unordered_map and not std::map我什么时候应该使用 unordered_map 而不是 std::map
【发布时间】:2011-09-04 15:44:54
【问题描述】:

我想知道在哪种情况下我应该使用 unordered_map 而不是 std::map。

每次我不注意地图中元素的顺序时,我都必须使用 unorderd_map ?

【问题讨论】:

    标签: c++ hashmap


    【解决方案1】:

    map

    1. 通常使用red-black tree实现。
    2. 元素已排序。
    3. 内存使用量相对较小(哈希表不需要额外的内存)。
    4. 相对快速的查找:O(log N)。

    unordered_map

    1. 通常使用hash-table实现。
    2. 元素未排序。
    3. 需要额外的内存来保存哈希表。
    4. 快速查找 O(1),但恒定时间取决于 hash-function,这可能相对较慢。另请注意,您可以与Birthday problem 会面。

    【讨论】:

    • 哈希表的内存是干什么用的?不就是一个哈希函数吗?所以我的理解是:哈希映射的内存 = 映射的内存 = O(n)
    • @ZakariaJaiathe 认为您有一个哈希函数,其返回类型为 int16。因此,您需要一个包含 2^16 个元素的表,因为您需要将函数输出映射到元素。无论容器中有多少真实元素,您都需要为占位符存储内存。使用所谓的 pre-hash 函数来减少映射值的字段有一个技巧,但它需要更多的字符来详细描述它,然后注释才允许
    • 谢谢。也许您可以将它写在多个 cmets 上,或者如果您有一些有用的链接。
    • 我不明白查找如何是 O(1).. Theta(1) 在桶数足够接近 N 的情况下更有意义,但查找的最坏情况复杂度应该始终为 O(N/c),其中 c(常数)是简化为 O(N) 的存储桶数。
    【解决方案2】:

    比较哈希表 (undorded_map) 与二叉树 (map),记住您的 CS 类并进行相应调整。

    哈希映射在查找时通常有 O(1),映射有 O(logN)。如果您需要许多快速查找,这可能是一个真正的区别。

    地图保持元素的顺序,这有时也很有用。

    【讨论】:

      【解决方案3】:

      map 允许以排序方式遍历元素,但unordered_map 不允许。
      因此,当您需要按排序顺序遍历地图中的项目时,请使用std::map

      【讨论】:

        【解决方案4】:

        您选择其中之一的原因是性能。否则他们只会创建std::map,因为它为你做的更多:)

        当您需要对元素进行自动排序时,请使用std::map。其他时间使用std::unordered_map

        the SGI STL Complexity Specifications rationale

        【讨论】:

          【解决方案5】:

          unordered_map 是 O(1),但查找、插入和删除的持续开销相当高。 map 是 O(log(n)),因此请选择最适合您需求的复杂度。此外,并非所有的键都可以放入这两种映射中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-09
            • 2011-12-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多