函数模板
<algorithm>

std::upper_bound

默认 (1)
template <class ForwardIterator, class T>  ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,                               const T& val);
自定义 (2)
template <class ForwardIterator, class T, class Compare>  ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,                               const T& val, Compare comp);
返回指向上界的迭代器
返回一个指向范围 [first,last) 中第一个大于 val 的元素的迭代器。

元素使用第一个版本的 operator< 进行比较,第二个版本使用 comp 进行比较。范围中的元素应已根据相同的标准(operator<comp排序,或至少已根据 val 分区

该函数通过比较已排序范围中的非连续元素来优化比较次数,这对于随机访问迭代器特别高效。

lower_bound 不同,此函数返回的迭代器指向的值不能等于 val,只能大于。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class ForwardIterator, class T>
  ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator it;
  iterator_traits<ForwardIterator>::difference_type count, step;
  count = std::distance(first,last);
  while (count>0)
  {
    it = first; step=count/2; std::advance (it,step);
    if (!(val<*it))                 // or: if (!comp(val,*it)), for version (2)
      { first=++it; count-=step+1;  }
    else count=step;
  }
  return first;
}

参数

first, last
向前迭代器指向已排序(或正确分区)序列的起始和结束位置。使用的范围是 [first,last),它包含 first 和 last 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
val
要在范围内搜索的上界值。
对于 (1)T 应为支持与范围 [first,last) 中的元素作为 operator< 的左侧操作数进行比较的类型。
comp
二元函数,接受两个参数(第一个始终为 val,第二个为 ForwardIterator 指向的类型),并返回一个可转换为 bool 的值。返回的值指示第一个参数是否被认为排在第二个之前。
该函数不得修改其任何参数。
这可以是函数指针或函数对象。

返回值

指向范围内 val 的上界位置的迭代器。
如果范围内没有元素大于 val,则函数返回 last

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// lower_bound/upper_bound example
#include <iostream>     // std::cout
#include <algorithm>    // std::lower_bound, std::upper_bound, std::sort
#include <vector>       // std::vector

int main () {
  int myints[] = {10,20,30,30,20,10,10,20};
  std::vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20

  std::sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30

  std::vector<int>::iterator low,up;
  low=std::lower_bound (v.begin(), v.end(), 20); //          ^
  up= std::upper_bound (v.begin(), v.end(), 20); //                   ^

  std::cout << "lower_bound at position " << (low- v.begin()) << '\n';
  std::cout << "upper_bound at position " << (up - v.begin()) << '\n';

  return 0;
}

输出
lower_bound at position 3
upper_bound at position 6


复杂度

平均而言,复杂度是对 firstlast 之间距离的对数:执行大约 log2(N)+1 次元素比较(其中 N 是该距离)。
对于随机访问迭代器,迭代器前进本身会在平均情况下产生额外的线性复杂度。

数据竞争

访问范围 [first,last) 中的对象。

异常

如果元素比较或迭代器操作引发异常,则抛出。
请注意,无效参数会导致未定义行为

另见