大家好,我是Amy~
好久不见啊(主要是我太懒了,这几天比较忙,不想更新……再加上快开学了,我的作业还没有做完QAQ)你们的暑假作业都做完了吗(哦对,大佬不用做作业QAQ)
那今天我们就接着上次的binary_search函数来讲讲另外两个 “兄弟” 二分函数:lower_bound 和 upper_bound
lower_bound 和 upper_bound都是二分查找函数,为c++STL模板内的函数。比起手写二分,这些函数用起来会方便很多。
目录
二分思想
对二分不熟悉的可以先看看我的这篇讲二分的文章:C++二分解释【初学者放心进,简单易懂】
知道什么是二分了,我们就可以开始了解这两个函数了
lower_bound函数
lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个不小于value 的值
函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置(节选自lower_bound()函数用法_Anonymous-邦的博客-CSDN博客)
简单来讲就是在一个区间中进行二分查找,返回第一个大于等于目标值的元素位置
测试代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[14]={1,2,2,3,4,4,4,4,5,6,7,9,9,10};
cout<<lower_bound(a,a+14,4)<<endl;
cout<<lower_bound(a,a+14,4)-a<<endl;
return 0;
}
upper_bound函数
upper_bound也是二分查找函数,定义在 <algorithm> 头文件中,用于在区间内查找第一个大于目标值的元素位置
(博主太懒,加上能力有限,百度查不到想lower_bound一样专业的解释,就简单讲一下吧,用法和lower_bound类似)
测试代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[14]={1,2,2,3,4,4,4,4,5,6,7,9,9,10};
cout<<upper_bound(a,a+14,4)<<endl;
cout<<upper_bound(a,a+14,4)-a<<endl;
return 0;
}
格式
这两个函数的格式一样,和sort都很相似
大概就是:函数名(start , end , val) ;
区别
这两个函数虽然是兄弟,用法也几乎一样,但是在功能上还是有些许区别的
upper_bound是查找区间内第一个大于目标值的元素位置,而lower_bound确实查找区间内第一个大于等于目标值的元素位置
(区别好像也不是特别大,就是一个“等于”之差哈)
那今天就到这里啦,感谢您的支持
我是Amy,下期再见吧,拜拜~