被??将??lower_bound和upper_bound以及unique玩弄于股掌之中

  • lower_bound:返回第一个大于等于查找值的地址
  • upper_bound:返回第一个严格大于查找值的地址

使用这两个函数需要的头文件

#include <algorithm>
using namespace std;

要求数组必须是有序/单调的
在这里插入图片描述


lower_bound

lower_bound( a + 1, a + n + 1, x );

意义:查找数组 a a a [ 1 , n + 1 ) [1,n+1) [1,n+1)区间第一个大于等于 x x x的值的地址

upper_bound

upper_bound( a + 1, a + n + 1, x );

意义:查找数组 a a a [ 1 , n + 1 ) [1,n+1) [1,n+1)区间第一个大于 x x x的值的地址

l o w e r _ b o u n d , u p p e r _ b o u n d lower\_bound,upper\_bound lower_bound,upper_bound s o r t sort sort一样都是前闭后开

l o w e r _ b o u n d lower\_bound lower_bound为例
u p p e r _ b o u n d upper\_bound upper_bound是一样的

如果想要的是第一个大于等于 x x x的下标,可以减去数组名即可

lower_bound( a + 1, a + n + 1, x ) - a;

①:
不管查询的区间是哪到哪,返回的下标的永远是整个数组从 0 0 0开始计算的下标

举个例子:
数组:0 1 3 5 7 14
询问数组的第2项到第4项第一个大于等于1的下标
即3 5 7中第一个大于等于1的——3的下标为2
在这里插入图片描述②:
如果查询的整个区间里一个都没有大于等于查询值
返回的即为整个区间的下一位,也就是查询表示区间 [ l , r ) [l,r) [l,r)的开区间点 r r r
在这里插入图片描述在这里插入图片描述接下来讲讲为什么要求数组是有序的
一句话——因为 l o w e r _ b o u n d , u p p e r _ b o u n d lower\_bound,upper\_bound lower_bound,upper_bound实质是二分
在这里插入图片描述

如果不能保证数组的单调性
你的性命就完全由数据决定是春分刀斩还是秋后腰斩
在这里插入图片描述


偶尔可能会用到的——去重

unique();

食用指南:

返回的是也是地址,同样也需要一样的头文件

想要下标的操作同样是减去数组名

这个去重的前提依然是数组单调有序

unique( a + 1, a + n + 1 ) - a;

表示将数组 a a a [ 1 , n + 1 ) [1,n+1) [1,n+1)进行去重操作后得到的下标
为什么说是下标,因为其返回的其实是区间去重补位后在 a a a数组的下标
在这里插入图片描述

在这里插入图片描述在这里插入图片描述如果数组下标不是从 0 0 0开始的,那么要减去开始位置
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述建议自己整些数据手玩,说不定可以发现更多计算机的好玩之处哦!~
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Emm_Titan/article/details/113748109