参考:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html
ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。
lower_bound和upper_bound如下图所示:
1. lower_bound
这个序列中可能会有很多重复的元素,也可能所有的元素都相同,为了充分考虑这种边界条件,STL中的lower_bound算法总体上是采用了二分查找的方法,但是由于是查找序列中的第一个出现的值大于等于val的位置,所以算法要在二分查找的基础上做一些细微的改动。
int lower_bound(int *array int size ,int key) { int first=0,middle; int half,len; len=size; while(len>0) { half=len>>1; middle=first+half; if(array[middle]<key)//当中间的数小于key,在右边的子序列查找 { first=middle+1; len=len-half-1; } else len=half;//否则在左边 } return first; }
2. upper_bound
upper_bound返回的是最后一个大于等于val的位置,也是有一个新元素val进来时的插入位置。
int lower_bound(int *array int size ,int key) { int first=0,middle; int half,len; len=size; while(len>0) { half=len>>1; middle=first+half; if(array[middle]<=key) { first=middle+1; len=len-half-1; } else len=half; } return first; }