lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找。
在从小到大的排序数组中,
- lower_bound(begin, end, num); 从数组的begin位置到end-1
位置二分查找第一个大于等于num的数字,找到返回该数字的地址,不存在返回end。通过返回的地址减去起始地址begin,得到数字在数组中的下标。 - upper_bound(begin, end, num); 从数组的begin位置到end-1
位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在返回end。通过返回的地址减去起始地址begin,得到数字在数组中的下标。
在从大到小的排序数组中,
重载lower_bound()和upper_bound()
-
lower_bound( begin,end,num,greater< type>() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
-
upper_bound( begin,end,num,greater< type>() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn= 1e5+7;
#define long long ll
bool cmp(int a, int b){ return a > b;}
int main(){
int num[6] = {1, 2, 4, 7, 15, 34};
sort(num, num+6);
for(int i = 0; i < 6; i++) cout << num[i] << " ";cout << endl;
int pos1 = lower_bound(num, num+6, 7)-num;//返回数组中第一个大于或等于被查数
int pos2 = upper_bound(num, num+6, 7)-num;//返回数组中第一个大于被查数
cout<<pos1<<" "<<num[pos1]<<endl;
cout<<pos2<<" " <<num[pos2]<<endl;
sort(num, num+6, cmp);
int pos3 = lower_bound(num, num+6, 7, greater<int>())-num;//返回数组中第一个小于或等于被查数
int pos4 = upper_bound(num, num+6, 7, greater<int>())-num;//返回数组中第一个小于被查数
for(int i = 0; i < 6; i++) cout << num[i] << " ";cout << endl;
cout<<pos3<<" "<<num[pos3]<<endl;
cout<<pos4<<" " <<num[pos4]<<endl;
return 0;
}
注意:
- 返回的是地址;(要减去begin才得到下标)。
- 降序:一定要指定比较函数cmp–用于sort;lower_bound(): 小于等于; upper_bound()小于;//升降序都是在“后面”。
来源:CSDN
作者:qq_43642447
链接:https://blog.csdn.net/qq_43642447/article/details/104075016