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

本文详细介绍了C++中四个常用的二进制搜索函数:lower_bound用于查找指定值的下限,可能与目标值相等;upper_bound返回指定值的上限,确保大于目标值;equal_range返回相等元素的子范围边界;binary_search判断排序范围内是否存在目标值。每个函数都讨论了参数、返回值和复杂度。
摘要由CSDN通过智能技术生成

一、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
lower_bound()是C++标准库中的一个函数,用于在有序序列中进行二分查找。它返回的是指向大于等于目标值的第一个元素的迭代器位置。 举个例子来说明,假设有一个有序序列 {1, 3, 5, 7, 9},我们要查找大于等于6的第一个元素的位置,可以使用lower_bound()函数。在这个例子中,lower_bound()会返回指向元素7的迭代器位置,因为7是大于等于6的第一个元素。 在C++ STL标准库中,除了lower_bound()函数,还提供了upper_bound()、equal_range()和binary_search()这四个查找函数,它们的底层实现都采用了二分查找的方式。lower_bound()和upper_bound()函数在执行上类似,但lower_bound()返回大于等于目标值的第一个元素的位置,而upper_bound()返回大于目标值的第一个元素的位置。 所以,lower_bound()函数可以帮助我们在有序序列中找到大于等于目标值的第一个元素的位置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [lower_bound()/upper_bound()函数(C++)](https://blog.csdn.net/weixin_51566349/article/details/128086465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [C++ lower_bound() upper_bound() 函数用法详解(深入了解,一文学会)](https://blog.csdn.net/qq_37529913/article/details/125139815)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值