Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

lower_bound

函数模板  <algorithm>
default (1)
template <class ForwardIterator, class T>
  ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
                               const T& val);
custom (2)
template <class ForwardIterator, class T, class Compare>
  ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
                               const T& val, Compare comp);

返回范围下界的迭代器

返回范围[first,last)中第一个不小于val的元素的迭代器。。

第一个版本使用 operator< 比较元素,第二个版本使用comp操作符比较元素。 这个范围内的元素应该已经按照同样的标准排序(operator<或comp),或者至少根据val进行分区。

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

与upper_bound不同,该函数返回的迭代器所指向的值也可以等于val,而不仅仅是大于.

这个函数模板的行为相当于:
template <class ForwardIterator, class T>
  ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator it;
  iterator_traits<ForwardIterator>::difference_type count, step;
  count = distance(first,last);
  while (count>0)
  {
    it = first; step=count/2; advance (it,step);
    if (*it<val) {                 // or: if (comp(*it,val)), for version (2)
      first=++it;
      count-=step+1;
    }
    else count=step;
  }
  return first;
}

☲  参数


first, last
指向一个已排序(或正确分区)序列初始和最终位置的前向迭代器。使用的范围是[first,last), 它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。

val
该范围中要搜索的下界值。
对于(1),T是支持与range [first,last)的元素作为operator<的右侧操作数进行比较的类型。

comp
二元函数,接受两个实参(第一个是由ForwardIterator指向的类型,第二个总是val),并返回一个可转换为bool类型的值。返回的值表示第一个参数是否被认为在第二个参数之前。
函数不能修改它的任何参数。
它可以是函数指针,也可以是函数对象。

☉  返回值



指向范围内val的下界的迭代器。
如果范围内的所有元素都小于val,则函数返回last。

☣  示例



// 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

✥ 复杂度



平均而言, first and last之间的距离为对数:执行大约log2(N)+1个元素比较(其中N是距离)。
在非随机访问迭代器中,迭代器的前进平均会增加N个额外的线性复杂度。

⇄ 数据竞争


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

☂ 异常安全性



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

🍄  另请参阅



upper_bound 返回迭代器上界(函数模板)
equal_range 获取相等元素的子范围(函数模板)
binary_search 测试value是否存在于排序序列中(函数模板)
min_element 返回范围内最小的元素(函数模板)

联系我们 免责声明 关于CandCplus 网站地图