【问题标题】:Best STL container for fast lookups用于快速查找的最佳 STL 容器
【发布时间】:2019-04-11 00:53:43
【问题描述】:

我需要存储一个整数列表,并很快确定一个整数是否已经在列表中。不会存储重复项。

我不会插入或删除任何值,但我会附加值(这可能被实现为插入)。

什么是最好的 STL 容器类?我在 Google 上找到了std::multimap,但我似乎需要一个键/值对,而我没有。

我对 STL 还很陌生。我能得到一些建议吗?

【问题讨论】:

  • 供将来参考,here 是所有标准容器的列表。
  • unordered_set<int>
  • @FrançoisAndrieux:谢谢。但我不清楚哪个查找速度最快。 set 似乎是一种可能性。但同样,我不确定我是否清楚速度有多快。
  • 整数会落在某个范围内吗?
  • 你已经给出了复杂性。但是时间要求像往常一样对您的使用情况进行基准测试。 (线性搜索可能比使用缓存、分支预测等的二分搜索更快)。

标签: c++ collections stl


【解决方案1】:

当值和键不分开时,您可以使用集合来代替映射。

您可以使用不存储重复项的非多重版本来代替多重集/映射。

您可以使用std::unordered_set 而不是一组。对于您的用例,它可能会更快。

还有其他不太通用的数据结构可用于表示整数集,其中一些可能更有效,具体取决于用例。但那些其他数据结构不一定是标准库为您提供的。

但我不清楚哪个查找速度最快。

无序集在查找方面比有序集具有更好的渐近复杂度。对于您的用例是否更快,您可以通过测量来发现。

不可能超过一千左右

在这种情况下,渐近复杂度不一定相关。

特别是对于像这样的小型集合,排序向量可能非常有效。鉴于您“不会插入或删除任何值”,向量也不应该有明显的缺点。标准库不提供使用排序向量在内部实现的集合容器,但它确实提供了向量容器以及所有必要的算法。

我不知道容器如何计算哈希值。

您可以为无序容器提供哈希函数。默认情况下它使用std::hashstd::hash 使用实现定义的哈希函数。

【讨论】:

    【解决方案2】:

    std::unordered_set<int> 是跟踪ints 重复项的好选择,因为平均而言,插入和查找都可以在恒定时间内完成。


    插入

    在集合中插入一个新的int可以通过insert()成员函数实现:

    std::unordered_set<int> s;
    s.insert(7);
    

    查找

    可以使用find() 成员函数检查集合中是否存在给定的int

    bool is_present(const std::unordered_set<int>& s, int value) {
       return s.find(value) != s.end();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多