用于快速查找的最佳 STL 容器
Best STL container for fast lookups
我需要存储一个整数列表,并很快确定一个整数是否已经在列表中。不会存储任何重复项。
我不会插入或删除任何值,但我会附加值(可能实现为插入)。
最好的 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();
}
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 派生类销毁的最佳实践是什么
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- STL 中字典的最佳容器
- 用于快速查找的最佳 STL 容器
- STL/标准C++容器的最佳效率如何
- 最佳 STL 变换 - 类似于三元运算符的模板函数
- 复制包含STL成员(如vector)的C++结构的最佳方法是什么
- sql参数的最佳stl容器
- STL+typedefs与OOP,最佳实践
- 在自定义迭代器中包装STL容器的最佳方法是什么?
- 什么是VS2005的STL的最佳实现