最佳STL容器用于快速查找

时间:2019-04-11 00:53:44

标签: c++ collections stl

我需要存储一个整数列表,并非常快速地确定列表中是否已经有整数。不会存储任何重复项。

我不会插入或删除任何值,但会附加值(可以通过插入来实现)。

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

我刚接触STL。我可以得到一些建议吗?

2 个答案:

答案 0 :(得分:4)

当值和键不分开时,您可以使用集合而不是地图。

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

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

还有其他一些通用性较低的数据结构可用于表示整数集,其中某些结构可能会因用例而更为有效。但是标准库不一定会为您提供其他数据结构。

  

但是我不清楚哪个查询最快。

无序集合比有序集合具有更好的渐近复杂度。无论您的用例是否更快,您都可以通过测量来找出。

  

不太可能超过一千左右

在那种情况下,渐进复杂度不一定是相关的。

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

  

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

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

答案 1 :(得分:1)

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


插入

可以通过insert()成员函数将新的int插入集合:

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();
}