一般lower_bound(), upper_bound() 基本用法
定义: algorithm头文件的函数
功能: 二分查找,查询一个数组(vector也可以使用)中大于给定数的位置
条件: 因为是使用二分查找,所以数组必须是有序的(一定是小于) 一定先用sort一下
返回值: 返回目标的地址,所以你不能直接把返回值赋值给谁,一般要减去首地址,这样就得到目标的数组小标(反人类设计qwq),否则你会得到一个 *long long 不能赋值给 int的报错
区别:
- lower_bounder是找到第一个>=给定数字的位置
- upper_bounder是找到第一个 严格大于( 没有= ) 给定数的位置
使用:
lowwer_bounder(s+a,s+b,t)
upper_bounder(s+a,s+b,t)
- s 是数组
- 第一个参数是查找范围的左边界(左闭区间) ,0就不写了(s)
- 第二个参数是查找范围的右边界(右开区间,超尾原理)
- 第三个数据是我们要找的数据
- 如果找到最后都找不到就返回end,就是ss+b
示例:
s[10]={0,1,2,3,4,4,6,7,8,9}
cout<<lower_bounder(s,s+10,4)-s<<endl
cout<<upper_bounder(s,s+10,4)-s<<endl
cout<<lower_bounder(s,s+10,100)-s<<endl
输出
4
6
10
特殊的lower_bound(), upper_bound() 基本用法
定义: set/multiset中的一个方法
相同: 功能相同
区别: 无需指定查找区间,范围就是整个set/multiset
用法:
auto it=s.upper_bound(a[i]);
查找严格小于或小于等于某数的结果
1.结构体重载<
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct s{
int t;
bool operator < (const s tmp)const{
return t>tmp.t;
}
}a[20]={1,2,3,4,5,6,7,8,9,10};
int main(){
sort(a,a+10); //必须默认顺序排序
int pos=upper_bound(a,a+10,s({5}))-a;
cout<<a[pos].t;
return 0;
}
2.使用greater
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[20]={1,2,3,4,5,6,7,8,9,10};
bool cmp(int a,int b){
return a>b;
}
int main(){
sort(a,a+10,cmp); //必须是从大到小排序
// sort(a,a+10);
int pos=upper_bound(a,a+10,5,greater<int>())-a;
cout<<a[pos];
return 0;
}
greater<> & less<>
两个函数的头文件是
- 建堆的时候,默认是小根堆,第三个参数用greater会变成大根堆;
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
set<int,greater<int> > s;
int main(){
s.insert(5);
s.insert(4);
s.insert(3);
s.insert(2);
cout<<*s.begin();
return 0;
}
- 排序的时候,默认是从小到大,但是第三个参数用greater会变成从大到小,而不需要cmp
- upper_bound默认是找大于,但是第三个参数用greater就是找小于
- 优先队列默认是从大到小,但是用greater会变成从小到大,注意与一般的相比要加一个
vector<int>
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
就当默认是less,相反就加greater