SGI

lower_bound

类别: 算法 组件类型: 函数

原型

Lower_bound是一个重载名称;实际上有两个lower_bound函数。
template <class ForwardIterator, class LessThanComparable>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
                            const LessThanComparable& value);

template <class ForwardIterator, class T, class StrictWeakOrdering>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
                            const T& value, StrictWeakOrdering comp);

描述

Lower_bound是二分查找的一个版本:它试图找到元素在有序范围内[first, last) [1]. 具体来说,它返回第一个位置,在该位置可以插入而不会违反排序。 [2] 第一个版本lower_bound使用operator<进行比较,第二个版本使用 函数对象comp.

第一个版本lower_bound返回最远的迭代器i[first, last)这样,对于每个迭代器j[first, i), *j < value.

第二个版本lower_bound返回最远的迭代器i[first, last)这样,对于每个迭代器j[first, i), comp(*j, value)true.

定义

定义在标准头文件 algorithm 中,以及非标准向后兼容头文件 algo.h 中。

类型要求

对于第一个版本对于第二个版本

先决条件

对于第一个版本对于第二个版本

按升序排序

复杂度比较次数是对数级的:最多log(last - first) + 1ForwardIterator。 如果是一个 随机访问迭代器,那么遍历范围的步数也是对数级的;否则,步数与. [3]

last - first

int main()
{
  int A[] = { 1, 2, 3, 3, 3, 5, 8 };
  const int N = sizeof(A) / sizeof(int);

  for (int i = 1; i <= 10; ++i) {
    int* p = lower_bound(A, A + N, i);
    cout << "Searching for " << i << ".  ";
    cout << "Result: index = " << p - A << ", ";
    if (p != A + N)
      cout << "A[" << p - A << "] == " << *p << endl;
    else
      cout << "which is off-the-end." << endl;
  }
}
成正比
Searching for 1.  Result: index = 0, A[0] == 1
Searching for 2.  Result: index = 1, A[1] == 2
Searching for 3.  Result: index = 2, A[2] == 3
Searching for 4.  Result: index = 5, A[5] == 5
Searching for 5.  Result: index = 5, A[5] == 5
Searching for 6.  Result: index = 6, A[6] == 8
Searching for 7.  Result: index = 6, A[6] == 8
Searching for 8.  Result: index = 6, A[6] == 8
Searching for 9.  Result: index = 7, which is off-the-end.
Searching for 10.  Result: index = 7, which is off-the-end.

例子

输出是备注[1] 注意,您可以使用严格弱排序但不是全排序的排序;也就是说,可能存在值这样x, yx < yx > yfalsex == y都是[first, last)。 (有关更完整的讨论,请参阅 小于可比较 要求。) 查找在范围内,然后,并不意味着找到一个与相等的元素,而是找到一个与等效的元素:一个既不大于也不小于的元素。 但是,如果您使用的是全排序(如果您使用的是

strcmp,例如,或者如果您对整数使用普通的算术比较),那么您可以忽略这种技术区别:对于全排序,相等和等效是相同的。[first, last)[2] 如果一个与 [1]lower_bound等效的元素已存在于范围内

,那么的返回值将是一个指向该元素的迭代器。[3] 随机访问迭代器正向迭代器 之间的这种差异仅仅是因为

advance

对于 随机访问迭代器 是恒定时间,而对于 正向迭代器 是线性时间。, 另请参阅, upper_bound
[Silicon Surf] [STL Home]
equal_range binary_search