C++二进制搜索(在分区/排序范围上运行)(lower_bound;upper_bound;equal_range;binary_search)

一、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;
}

参数

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

返回值

到范围中val下限的迭代器。
如果范围中的所有元素都比val小,则函数返回last。

复杂度

平均而言,第一个和最后一个之间距离的对数:执行大约log2(N)+1个元素比较(其中N是该距离)。
在非随机访问迭代器上,迭代器的进展产生了N平均额外的线性复杂度。

二、upper_bound

头文件algorithm

default (1)	
template <class ForwardIterator, class T>
  ForwardIterator upper_bo
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值