- lower_bound:返回第一个大于等于查找值的地址
- upper_bound:返回第一个严格大于查找值的地址
使用这两个函数需要的头文件
#include <algorithm>
using namespace std;
要求数组必须是有序/单调的
lower_bound
lower_bound( a + 1, a + n + 1, x );
意义:查找数组aaa中[1,n+1)[1,n+1)[1,n+1)区间第一个大于等于xxx的值的地址
upper_bound
upper_bound( a + 1, a + n + 1, x );
意义:查找数组aaa中[1,n+1)[1,n+1)[1,n+1)区间第一个大于xxx的值的地址
lower_bound,upper_boundlower\_bound,upper\_boundlower_bound,upper_bound和sortsortsort一样都是前闭后开的
以lower_boundlower\_boundlower_bound为例
upper_boundupper\_boundupper_bound是一样的
如果想要的是第一个大于等于xxx的下标,可以减去数组名即可
lower_bound( a + 1, a + n + 1, x ) - a;
①:
不管查询的区间是哪到哪,返回的下标的永远是整个数组从000开始计算的下标
举个例子:
数组:0 1 3 5 7 14
询问数组的第2项到第4项第一个大于等于1的下标
即3 5 7中第一个大于等于1的——3的下标为2
②:
如果查询的整个区间里一个都没有大于等于查询值
返回的即为整个区间的下一位,也就是查询表示区间[l,r)[l,r)[l,r)的开区间点rrr
接下来讲讲为什么要求数组是有序的
一句话——因为lower_bound,upper_boundlower\_bound,upper\_boundlower_bound,upper_bound的实质是二分
如果不能保证数组的单调性
你的性命就完全由数据决定是春分刀斩还是秋后腰斩
偶尔可能会用到的——去重
unique();
食用指南:
返回的是也是地址,同样也需要一样的头文件
想要下标的操作同样是减去数组名
这个去重的前提依然是数组单调有序
unique( a + 1, a + n + 1 ) - a;
表示将数组aaa的[1,n+1)[1,n+1)[1,n+1)进行去重操作后得到的下标
为什么说是下标,因为其返回的其实是区间去重补位后在aaa数组的下标
如果数组下标不是从000开始的,那么要减去开始位置
建议自己整些数据手玩,说不定可以发现更多计算机的好玩之处哦!~