lower_bound( )和upper_bound( )用法
阿新 • • 發佈:2018-11-16
首先,使用的前提是排好序的非遞減陣列。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( begin,end,num,greater() ):從陣列的begin位置到end-1位置二分查詢第一個小於或等於num的數字,找到返回該數字的地址,不存在則返回end。通過返回的地址減去起始地址begin,得到找到數字在陣列中的下標。
upper_bound( begin,end,num,greater() ):從陣列的begin位置到end-1位置二分查詢第一個小於num的數字,找到返回該數字的地址,不存在則返回end。通過返回的地址減去起始地址begin,得到找到數字在陣列中的下標。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[1001];
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int l=lower_bound(a,a+n,m)-a; //返回陣列中第一個大於或等於查詢數的值
int r=upper_bound(a,a+n,m)-a; //返回陣列中第一個大於查詢數的值
cout<<l<<" " <<a[l];
cout<<r<<" "<<a[r];
sort(a,a+n,greater<int>());
int x=lower_bound(a,a+n,m,greater<int>())-a;
int y=upper_bound(a,a+n,m,greater<int>())-a;
cout<<x<<" "<<a[x];
cout<<y<<" "<<a[y];
}