C++ 用于快速查找的最佳STL容器
我需要存储一个整数列表,并快速确定列表中是否已经存在一个整数。不会存储任何副本 我不会插入或删除任何值,但会附加值(可能实现为插入) 这方面最好的STL容器类是什么?我在谷歌上找到了C++ 用于快速查找的最佳STL容器,c++,collections,stl,C++,Collections,Stl,我需要存储一个整数列表,并快速确定列表中是否已经存在一个整数。不会存储任何副本 我不会插入或删除任何值,但会附加值(可能实现为插入) 这方面最好的STL容器类是什么?我在谷歌上找到了std::multimap,但我发现它似乎需要一个键/值对,而我没有 我是STL的新手。我可以得到一些建议吗?当值和键不分开时,可以使用集合而不是映射 您可以使用不存储重复项的非多版本,而不是多集/-map 您可以使用std::unordered_set替代集合。对于您的用例,它可能更快 还有其他不太通用的数据结构可
std::multimap
,但我发现它似乎需要一个键/值对,而我没有
我是STL的新手。我可以得到一些建议吗?当值和键不分开时,可以使用集合而不是映射 您可以使用不存储重复项的非多版本,而不是多集/-map 您可以使用
std::unordered_set
替代集合。对于您的用例,它可能更快
还有其他不太通用的数据结构可用于表示整数集,其中一些可能更有效,具体取决于用例。但是标准库不一定为您提供这些其他数据结构
但我不清楚哪个搜索速度最快
无序集比有序集具有更好的查找渐近复杂性。对于您的用例,它是否更快,您可以通过测量来发现
不可能超过一千左右
在这种情况下,渐近复杂性并不一定相关
特别是对于这样的小ish集,排序向量可以非常有效。考虑到您“不会插入或删除任何值”,向量也不会有明显的缺点。标准库没有提供使用排序向量在内部实现的集合容器,但它提供了向量容器以及所有必要的算法
我不知道容器是如何计算散列的
您可以为无序容器提供哈希函数。默认情况下,它使用std::hash
std::hash
使用实现定义的哈希函数。是跟踪int
s的重复项的好选择,因为插入和查找平均可以在恒定时间内完成
插入 使用成员函数可以在集合中插入新的
int
:
std::unordered_set<int> s;
s.insert(7);
bool is_present(const std::unordered_set<int>& s, int value) {
return s.find(value) != s.end();
}
以下是所有标准容器的列表供将来参考。
无序集
@FrançoisAndrieux:谢谢。但我不清楚哪个搜索速度最快<代码>设置似乎是一种可能性。但是,我也不清楚我的速度有多快。整数会落在某个范围内吗?你已经给出了复杂性。但时间安排需要像往常一样以您的使用情况为基准。(在缓存使用、分支预测等方面,线性搜索可能比二进制搜索更快)。