您的位置:首页 > 编程语言 > C语言/C++

lower_bound()和upper_bound()详解(附源码)

2017-08-18 18:45 597 查看

STL中的lower_bound()和upper_bound()

lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了第一个大于等于value 的值。而upper_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了第一个大于value 的值。这两个函数为C++ STL内的函数。

简单来讲就是:

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的位置。

如下图所示:



看上面这个图,基本上就明白这两个东西的用处了。

在代码中用是记得加上头文件(
#include<algorithm>


下面贴出STL库源代码:

lower_bound():

//这个算法中,first是最终要返回的位置
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;            //在左边子序列(包含middle)中查找
}
return first;
}


upper_bound()

int upper_bound(int *array, int size, int key)
{
int first = 0, len = size-1;
int half, middle;

while(len > 0){
half = len >> 1;
middle = first + half;
if(array[middle] > key)     //中位数大于key,在包含last的左半边序列中查找。
len = half;
else{
first = middle + 1;    //中位数小于等于key,在右半边序列中查找。
len = len - half - 1;
}
}
return first;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stl 源码 C++