用于快速查找的最佳 STL 容器

Best STL container for fast lookups

本文关键字:最佳 STL 容器 查找 用于      更新时间:2023-10-16

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

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

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

我对STL相当陌生。我可以得到一些建议吗?

当值和键不分离时,可以使用集合而不是映射。

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

您可以使用std::unordered_set作为替代方案,而不是集合。对于您的用例来说,它可能更快。

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

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

无序集比有序集具有更好的查找渐近复杂度。对于您的用例来说,它是否更快,您可以通过测量来了解。

不太可能超过一千左右

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

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

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

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

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