我应该使用哪个容器来快速找到一个元素,知道它已经通过构造订购了?
Which container should I use to quickly find an element, knowing that by construction it's already ordered?
我必须使用一个已经通过构造订购的容器,我需要一个快速查找功能。
我的想法是使用集合来利用它的set.find
,这应该足够快,但是用set.insert
构造我的集合可能会很慢,因为我已经知道元素是有序的!
对于这部分,我可以只使用带有 vector.push_back
的向量,但是我应该自己编写 find 函数,它也比set::find
慢......你对我有什么建议?
编辑:
- 容器需要修改,但将始终被订购,并且其大小将始终相同(但我不知道先验)
- 没有重复的值。
- 发现比插入多得多。
- 我只需要知道它是否存在,而不是它的位置。
- 我找到了标准::binary_search。好不好?
如果输入范围已经排序,则从一对迭代器构造set
可以保证为 O(N),因此您可以使用它。(参见例如 http://en.cppreference.com/w/cpp/container/set/set。
后续插入为 O(log N)。
尽管如果总大小不是那么大,排序vector
往往会击败其他所有内容,因为它对缓存非常友好。 std::binary_search
是 O(log N),与 set::find
相同。
std::unordered_set
不在乎你的排序,但会给你O(1)查找(平均而言,没有保证)。
std::vector
std::make_heap()
、push_heap()
、pop_heap()
和sort_heap()
可以帮助您尽快处理它std::set
。但是,您需要手动使用 std::binary_search。
相关文章:
- lower_bound()返回最后一个元素
- 使用std::transform将一个范围的元素添加到另一个范围中
- 我想访问std::unique_ptr中的一个特定元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 删除映射和分割错误中的一个过去结束元素
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- 仅显示链表的最后一个元素
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 查找最小的下一个更大的元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素