lower_bound和upper_bound均利用了二分查找算法,在一个数组中进行查数。

lower_bound(begin,end,x)-数组名。从begin位置到end-1位置,查找第一个大于等于x的数的位置。如果不存在,返回的是end

upper_bound(begin,end,x)-数组名。从begin位置到end-1位置,查找第一个大于x的数的位置。如果不存在,返回的是end

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
int a[10]={0,3,4,2}; // 0 2 3 4
sort(a,a+4);
int l=upper_bound(a,a+4,32)-a; // 不存在 输出4
int l=upper_bound(a,a+4,2)-a; // 输出1
int l=upper_bound(a,a+4,4)-a; //输出 3

如果要返回最后一个小于等于x的位置,直接在上面获取的下标-1即可。

lower_bound( begin,end,num,greater<type>() )-num,从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,不存在则返回end-1。

upper_bound( begin,end,num,greater<type>() )-num,从数组的begin位置到end-1位置二分查找第一个小于num的数字,不存在则返回end-1。