为什么对排序向量进行的二进制搜索比STD :: SET FIND慢
Why is a binary search over a sorted vector is slower than std::set find?
在这里您可以看到代码,运行并查看时间。
http://rextester.com/mnqzs47293
我在我的计算机上获得了类似的结果(使用相同版本的MSVC),向量中的查找比std :: Set。
慢。由于数据的局部性更好(更友好),我希望分类的向量版本会更快。在更糟糕的情况下,我希望它们会相似,因为它们都执行二进制搜索,但是我不明白为什么STD :: SET比分类的向量版本要快得多。
非常感谢
编辑:对不起,我粘贴了错误的链接(我修改了代码,但忘记复制链接)旧代码使用unordered_set,此代码使用集合,问题仍然相同:为什么二进制搜索排序的矢量比集合较慢?我注意到,如果元素数量足够大,那么排序的向量速度更快,但是我仍然不明白为什么该集合可以在任何数量的元素上胜过分类的向量。
链接代码似乎使用unordered_set
,而不是set
。
unordered_set
是一个哈希表。那里的搜索是不是二进制搜索。在那里,搜索性能取决于哈希功能和负载因子。
对于更新的问题:
-O1
和-O2
给出了两种方法相同的性能。
-Ox
减慢了向量版本。
为什么是,您需要查看拆卸或-Ox
级别的详细信息。它与set.find
和lower_bound/binary_search
的算法属性无关。
关于数据的局部性。binary_search和set :: find具有与数据的合理实现相同的合理实现。该集合甚至可能以左右读取的数据获胜。
相关文章:
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 修改"std::set"中用户定义类型的值
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 我从 std::set 得到const_iterator而不是迭代器
- 为什么 std:set(带有单个冒号)可以编译?
- 遍历 std::set 中包含的所有三重不同值?
- 插入 std::set 作为 std::map 的键
- 如何在 c++ 中使用默认值将 std::set 转换为 std::map
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 如何从 std::set 绘制 n 个元素的样本
- 为什么 std::set 容器使用的内存比其数据大小多得多?