【问题标题】:Is it faster to lookup in set than unordered_map [closed]在集合中查找是否比 unordered_map 更快 [关闭]
【发布时间】:2019-07-07 03:49:00
【问题描述】:

我有一个关于查找速度的问题。我想知道哪个 STL 容器可以在 C++ 中产生最快的查找时间。我想到了unordered_map,因为它是通过哈希映射实现的,但我担心它的性能会受到惩罚,因为它包含键值对,而set 只包含键。我想答案将取决于 1)密钥的数据类型; 2)set的STL实现。

换句话说,哪个容器可以更快地搜索键的存在,是 set、unordered_map 还是其他?

编辑:

如果对容器的实现或机制有更多解释,将不胜感激。例如,unordered_map 很快,因为它是用 hashmap 实现的。这比说“这取决于需要”更有帮助。谢谢!

【问题讨论】:

  • 取决于很多,即使在std::vector 中进行线性搜索也可能比对数搜索更快。
  • 你知道还有unordered_set,对吧?
  • 没有一个标准容器会给你最快的查找时间。哈希表的实现比 STL 的无序容器更好。甚至,如果您了解您的用例,您可以针对该情况优化您自己的哈希表实现(或者,在特定情况下,可能有比哈希表更适合的结构)。

标签: c++ stl set unordered-map


【解决方案1】:

这在很大程度上取决于数据的分布、数据集的大小、编译器、工具链...

您知道的唯一方法是衡量它为您的用例。

在为您的任务选择 the appropriate container 后执行此操作,然后仅当您发现需要这样做并且这样做可以为您的用例获得更好的性能时才切换到其他内容。

根据您的问题,我会说在setunsorted_set 之间进行选择。另一方面,如果您实际上还不知道您的数据是否同时具有键 值,那么您可能还没有准备好开始分析您的解决方案。

【讨论】:

    【解决方案2】:

    换个角度考虑这个观点,

    由于您在这里感兴趣的是性能,因此您可能希望以优化利用缓存线的方式设计数据结构

    如果元素的数量不太多,那么向量将胜过所有其他容器。就是这种情况,因为向量将元素存储在连续的内存位置,并且您的缓存喜欢连续的内存分配

    您还提到了阻碍查找速度的键值对。从缓存线的角度解决这个问题的一种方法是将键存储在一个连续的数据结构中,单独使用键进行查找。只有当你有命中时,你可能想从你的键值对中读取相应的值

    Check out this talk by Mike acton for more on this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2012-03-10
      • 2014-07-08
      • 2012-02-14
      相关资源
      最近更新 更多