自己实现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
- 自己实现STL模板upper_bound() 和lower_bound()
- stl lower_bound 和 upper_bound
- STL lower_bound和upper_bound
- [STL] lower_bound和upper_bound
- 手动实现stl中的lower_bound和upper_bound
- STL upper_bound(),lower_bound()函数的学习+自己的实现
- stl lower_bound,upper_bound的实现;
- C++ STL lower_bound 和 upper_bound
- STL中的lower_bound() 和 upper_bound()
- stl中的upper_bound和lower_bound
- STL----lower_bound和upper_bound算法
- 实现lower_bound和upper_bound算法
- lower_bound upper_bound的简单实现(STL)
- STL源码学习----lower_bound和upper_bound算法
- STL源码学习----lower_bound和upper_bound算法
- C++ STL中的 lower_bound() 和 upper_bound()
- STL源码学习----lower_bound和upper_bound算法
- 【STL源码学习】----lower_bound和upper_bound算法
- 命名规则的力量
- TDD工具Junit4介绍
- [学习记录用][Win32 API]AutoRun免疫工具编写
- Android startActivity出现FLAG_ACTIVITY_NEW_TASK报错
- 类和对象
- 自己实现STL模板upper_bound() 和lower_bound()
- stm32f芯片唯一ID的加密
- Java学习笔记1:考虑用静态工厂方法代替构造器
- CI框架中文语言包设置下载
- poj 1185 炮兵阵地 (状态压缩DP)
- HTTP普及帖1:理解Web和网络基础
- chrome下载网页音乐
- Java学习笔记2:当构造方法有多个参数时考虑使用Builder
- 自说明代码:关于注释的一点事儿