自己实现STL模板upper_bound() 和lower_bound()

来源:互联网 发布:csgo淘宝和 编辑:程序博客网 时间:2024/05/21 12:41

一、upper_bound() 

用法upper_bound(iterator,iterator,val)  在set中,还可以s.upper_bound(val);

作用 在一个左闭右开非递减序列中,找一个大于val的最小的数的地址,如果序列中都大于val,返回左区间,都不大于val,返回右区间。

**在一个递增序列[L,R)中,二分查找大于val最小的数*/template<class F,class T>F upper_boundSQ(F s,F e,T val){    //if(*s>val)return s;    F L=s,R=e-1;    //if(*R<=val)return e;    while(L<=R)    {        F mid=L+(R-L)/2;        if(L==R&&*mid>val)return mid;        else if(*mid<=val)            L=mid+1;        else            R=mid-1;    }    return L;}int main (){    vector<int> a;    a.push_back(1);    a.push_back(1);    a.push_back(2);    a.push_back(3);    a.push_back(4);    a.push_back(5);    //a.size()=6    /**upper_bound(iterator,iterator,val)一个左闭右开递增序列,找一个大于val的最小的数的地址    如果序列中都大于val,返回左区间,都不大于val,返回右区间*/    cout<<upper_bound(a.begin(),a.end(),0)-a.begin()<<endl;//输出0 (a.begin())    cout<<upper_bound(a.begin(),a.end(),1)-a.begin()<<endl;//输出2 (a[2])    cout<<upper_bound(a.begin(),a.end(),6)-a.begin()<<endl;//输出6 (a.end())    ///////    cout<<"myself"<<endl;    cout<<upper_boundSQ(a.begin(),a.end(),0)-a.begin()<<endl;//输出0 (a.begin())    cout<<upper_boundSQ(a.begin(),a.end(),1)-a.begin()<<endl;//输出2 (a[2])    cout<<upper_boundSQ(a.begin(),a.end(),6)-a.begin()<<endl;//输出6 (a.end())    return 0;}
二、lower_bound() 

用法lower_bound(iterator,iterator,val)  在set中,还可以s.lower_bound(val);

作用: 在一个左闭右开非递减序列中,找一个大于等于val的最小的数的地址,如果序列中都大于等于val,返回左区间,都小于val,返回右区间。

#include <iostream>#include <vector>#include <cstdio>#include <algorithm>#include <map>#include <set>using namespace std;#define rep(i,n) for(int i=0;i<n;i++)#define pb push_back#define M 100005#define CLS(x,v) memset(x,v,sizeof(x))#define pii pair<int,int>#define LL long long/**在一个递增序列[L,R)中,二分查找大于val最小的数*/template<class F,class T>F lower_boundSQ(F s,F e,T val){    //if(*s>=val)return s;    F L=s,R=e-1;    //if(*R<val)return e;    while(L<=R)    {        F mid=L+(R-L)/2;        if(L==R&&*mid>val)return mid;        else if(*mid<val)            L=mid+1;        else            R=mid-1;    }    return L;}int main (){    vector<int> a;    a.push_back(1);    a.push_back(1);    a.push_back(2);    a.push_back(4);    a.push_back(5);    a.push_back(6);    //a.size()=6    /**lower_bound(iterator,iterator,val)一个左闭右开递增序列,找一个>=val的最小的数的地址    如果序列中都>=val,返回左区间,都<val,返回右区间*/    cout<<lower_bound(a.begin(),a.end(),0)-a.begin()<<endl;//输出0 (a.begin())    cout<<lower_bound(a.begin(),a.end(),1)-a.begin()<<endl;//输出0 (a[0])    cout<<lower_bound(a.begin(),a.end(),2)-a.begin()<<endl;//输出2 (a[2])    cout<<lower_bound(a.begin(),a.end(),3)-a.begin()<<endl;//输出3 (a[3]=4)    cout<<lower_bound(a.begin(),a.end(),6)-a.begin()<<endl;//输出5 (a[5]=6)    cout<<lower_bound(a.begin(),a.end(),100)-a.begin()<<endl;//输出6 (a.end())    ///////    cout<<"myself"<<endl;    cout<<lower_boundSQ(a.begin(),a.end(),0)-a.begin()<<endl;//输出0 (a.begin())    cout<<lower_boundSQ(a.begin(),a.end(),1)-a.begin()<<endl;//输出0 (a[0])    cout<<lower_boundSQ(a.begin(),a.end(),2)-a.begin()<<endl;//输出2 (a[2])    cout<<lower_boundSQ(a.begin(),a.end(),3)-a.begin()<<endl;//输出3 (a[3]=4)    cout<<lower_boundSQ(a.begin(),a.end(),6)-a.begin()<<endl;//输出5 (a[5]=6)    cout<<lower_boundSQ(a.begin(),a.end(),100)-a.begin()<<endl;//输出6 (a.end())    return 0;}
三、binary_search()

用法bool  binary_search(iterator,iterator,val)  在set中,没有这个方法!

作用: 在一个左闭右开非递减序列中,查找是否存在等于val的数。

/**在一个递增序列[L,R)中,二分查找是否存在==val的数*/template<class F,class T>bool binary_searchSQ(F s,F e,T val){    F L=s,R=e-1;    while(L<=R)    {        F mid=L+(R-L)/2;        if(*mid==val)return 1;        else if(*mid<val)            L=mid+1;        else            R=mid-1;    }    return 0;}int main (){    vector<int> a;    a.push_back(1);    a.push_back(1);    a.push_back(2);    a.push_back(4);    a.push_back(5);    a.push_back(6);    //a.size()=6    /**binary_search(iterator,iterator,val)一个左闭右开递增序列,查找是否存在一个==val*/    cout<<binary_search(a.begin(),a.end(),0)<<endl;//输出0    cout<<binary_search(a.begin(),a.end(),1)<<endl;//输出1    cout<<binary_search(a.begin(),a.end(),2)<<endl;//输出1    cout<<binary_search(a.begin(),a.end(),3)<<endl;//输出0    cout<<binary_search(a.begin(),a.end(),6)<<endl;//输出1    cout<<binary_search(a.begin(),a.end(),100)<<endl;//输出0    ///////    cout<<"myself"<<endl;    cout<<binary_searchSQ(a.begin(),a.end(),0)<<endl;//输出0    cout<<binary_searchSQ(a.begin(),a.end(),1)<<endl;//输出1    cout<<binary_searchSQ(a.begin(),a.end(),2)<<endl;//输出1    cout<<binary_searchSQ(a.begin(),a.end(),3)<<endl;//输出0    cout<<binary_searchSQ(a.begin(),a.end(),6)<<endl;//输出1    cout<<binary_searchSQ(a.begin(),a.end(),100)<<endl;//输出0    return 0;}




0 0
原创粉丝点击