函数原型
upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp &__val)
upper_bound(_ForwardIterator __first, _ForwardIterator __last,const _Tp &__val, _Compare __comp)
lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp &__val)
lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp &__val,_Compare __comp)
函数解释:
两个函数底部都由二分搜索实现,用于在有序数组中搜索。
在从小到大排列的数组中,upper_bound()函数搜索第一个大于val值的元素,并返回其迭代器,如果没有符合条件的元素返回END()。
在从小到大排列的数组中,lower_bound()函数搜索第一个大于等于val值的元素,并返回其迭代器,如果没有符合条件的元素返回END()。
实现比较函数重载
数组中的元素必须能用使用’<'运算符,如果想要对自定义的结构体进行搜索则需要自定义函数,注意:无论是upper_bound还是lower_bound一律都用’<'运算符。
class T{
public:
int a;
int b;
};
bool comp(T* t1, T* t2){
return t1->a < t2->a;//只用第一个数字判断
}
T* val = new T*(1,2);
vector<T*> v;
upper_bound(v.begin(),v.end(), val,comp);//第一个大于val->a的元素
lower_bound(v.begin(),v.end(), val,comp);//第一个大于等于val->a的元素
在倒序中搜索
如果想要在从大到小排序的数组中使用二分搜索,也同样需要重写比较函数。注意:upper_bound(),lower_bound()比较函数符号都应为‘>’。
bool comp(int a, int b){
return a > b;
}
此时,upper_bound()函数表示第一个小于val的值,lower_bound()表示第一个小于等于val的值。