C++ 排序向量上std::lower_界的时间复杂度

C++ 排序向量上std::lower_界的时间复杂度,c++,c++11,vector,iterator,lower-bound,C++,C++11,Vector,Iterator,Lower Bound,我在学习《标准》:《上限》 我发现这可能在非随机访问迭代器上以线性时间运行 我需要用它来表示一个排序向量。现在我不知道什么是非随机访问迭代器,也不知道它是否会在排序向量上以对数时间运行 有人能帮我澄清一下吗。§23.3.6.1[向量概述]/p1: 向量是支持随机访问迭代器的序列容器 A是能够在恒定时间内计算任意元素的偏移量的元素,而不需要从一个位置迭代到另一个位置(这将导致线性复杂度) 它本身提供了二进制搜索算法的通用实现,不太关心使用什么迭代器来指示范围(它只要求迭代器至少属于一个类别)。它使

我在学习《标准》:《上限》 我发现这可能在非随机访问迭代器上以线性时间运行

我需要用它来表示一个排序向量。现在我不知道什么是非随机访问迭代器,也不知道它是否会在排序向量上以对数时间运行


有人能帮我澄清一下吗。

§23.3.6.1[向量概述]/p1:

向量是支持随机访问迭代器的序列容器

A是能够在恒定时间内计算任意元素的偏移量的元素,而不需要从一个位置迭代到另一个位置(这将导致线性复杂度)

它本身提供了二进制搜索算法的通用实现,不太关心使用什么迭代器来指示范围(它只要求迭代器至少属于一个类别)。它使用像
std::advance
这样的帮助函数来迭代地限制二进制搜索中的范围。对于属于随机访问类别的
std::vector::iterator
std::lower_bound
以对数时间复杂度运行,迭代元素所需的步骤数,因为它可以在恒定时间内将每个步骤的范围划分为一半

§25.4.3[二进制搜索]/p1:

本节中的所有算法都是二进制搜索的版本,并假定序列为 searched根据通过将搜索键绑定到的参数而形成的表达式进行分区 隐含或显式比较函数。他们使用非随机访问迭代器来最小化 比较次数,对于所有类型的迭代器都是对数的它们特别合适 对于随机访问迭代器,因为这些算法通过数据执行对数步数 结构。对于非随机访问迭代器,它们执行线性数量的步骤。


std::vector::iterator
属于随机访问类别,因此它将以对数时间运行?是的,它将以lg_n复杂度运行注意,“排序”是算法的要求,而不是改变其性能特征的选项。如果向量未排序,则算法的行为未定义。非随机访问迭代器的示例有
std::list::iterator
std::set::iterator