lower_bound与upper_bound
Posted ssfzmfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lower_bound与upper_bound相关的知识,希望对你有一定的参考价值。
lower_bound与upper_bound
1.作用
这两个是STL中的函数,作用很相似:
假设我们查找x,那么:
lower_bound会找出序列中第一个大于等于x的数
upper_bound会找出序列中第一个大于x的数
没错这俩就差个等于号╮(╯▽╰)╭
2.用法
以下都以lower_bound做栗子 (因为upper_bound做出的栗子不好吃)
(其实就是我懒得打两遍)
它们俩使用的前提是一样的:序列是有序的
对于一个数组a,在[1,n]的区间内查找大于等于x的数(假设那个数是y),函数就写成:
lower_bound(a + 1, a + 1 + n, x);
函数返回一个指向y的指针
看着是不是很熟悉?回想sort
使用的时候:
sort(a, a + 1 + n, cmp);
这里a+1,a+1+n
的写法是不是很像?
STL里面的函数写区间一般都这个尿性
同样的,lower_bound
和upper_bound
也是可以加比较函数cmp
的:
lower_bound(a + 1, a + 1 + n, x, cmp);
到这里不得不说说前面的"有序序列",这里的"有序"是对什么有序?
你可能已经猜到了,它是对于比较器有序,并且必须是升序!
(为什么不是降序?这个你可能要去问问写STL的人)
一旦对降序序列使用lower_bound
,就会出现神奇的错误,具体原因可以看这篇:
https://blog.csdn.net/qq1337715208/article/details/81072709
当然比较器默认也是"<"
如果要在一个下降序列里寻找一个小于x的数呢?
根据我们之前说的,lower_bound
只能对上升序列使用,那我假装下降序列是个上升序列就行了嘛~
(lower_bound:你当我傻吗)(w1049:没错我就当你傻)
只需要把比较器改成">":
lower_bound(a + 1, a + 1 + n, x, cmp);
同时需要写一个函数cmp
:
bool cmp(const int& a,const int& b){return a > b;}
当然,你也可以这样:
lower_bound(a + 1, a + 1 + n, x, greater <int> () );
这里的greater<int>()就是c++友情提供的方便的大于函数,这样就不用自己动手写一个cmp函数了(其实就是懒)
它们的实现方式是二分查找 ,存在的意义就是让我们写代码更方便地偷懒(一行lower_bound比写二分查找方便多了)
3.返回值
众所周知,小葱非常擅长计算组合数返回的是个指针
对于返回值我们有两种处理方式:
第一种:
许多人讨厌指针,那么我们用这个指针减去数组开头的指针(即数组名),得到两个指针的差,就是数组下标,即:
int p = lower_bound(懒得写) - a;
那么a[p]就是要找的y
(如果不知道为什么就记着好了)
第二种:
指针好!指针秒!
改革春风吹满地,用指针的oier真争气!
(以上两行你可以当做什么都没看见)
int *p = lower_bound(还是懒得写);
那么*p就是要找的y
可以看出指针多么直接,不像数组下标还要倒腾一遍
总结一下:
好像没什么可总结的QwQ
对一个下降序列a
int p = lower_bound(a + 1, a + 1 + n, x, greater <int> () ) - a;
a[p]即a[1]到a[n]中第一个小于等于x的数
(被遗忘的upper_bound表示不服)
来源于:https://www.luogu.com.cn/problemnew/solution/P1020
作者: w1049344862
以上是关于lower_bound与upper_bound的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C++ lower_bound() 允许返回与 val 等效的指针,而 upper_bound() 不允许
二分检索函数lower_bound()和upper_bound()