[STL] lower_bound和upper_bound
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的位置。
lower_bound和upper_bound如下图所示:

调用时注意,传入的firest 是第一元素的索引,传入的last是最后一个元素下一个元素的索引。
返回时,若所有元素都比targe 小,则返回last
STL 的equal_range是基于lower_bound 和upper_bound实现的
1, lower_bound
这个序列中可能会有很多重复的元素,也可能所有的元素都相同,为了充分考虑这种边界条件,STL中的lower_bound算法总体上是才用了二分查找的方法,但是由于是查找序列中的第一个出现的值大于等于val的位置,所以算法要在二分查找的基础上做一些细微的改动。
int lower_bound(int* array, int low, int high, int key )
{
int mid = ;
while(low < high)
{
mid = (low + high)/;
if(array[mid] >= key)
//若中位数的值大于等于key,我们要在左边子序列查找,但有可能middle处就是最终位置,所以我们要包含mid,让high保持不动, 让low不断逼近high。
high = mid;// 注意,包含mid,high=mid,不是high = mid+1;
else
low = mid+; //若中位数的值小于key的值,我们要在右边子序列中查找, 不包含mid }
return high; }
2, upper_bound
upper_bound返回的是最后一个大于等于val的位置,也是有一个新元素val进来时的插入位置
int upper_bound(int* array, int low, int high, int key )
{
int mid = ;
while(low < high)
{
mid = (low + high)/;
if(array[mid] > key)
//若中位数的值大于等于key,我们要在左边子序列查找,但有可能middle处就是最终位置,所以我们要包含mid,让high保持不动, 让low不断逼近high。
high = mid;// 注意,包含mid,high=mid,不是high = mid+1;
else
low = mid+; //若中位数的值小于key的值,我们要在右边子序列中查找, 不包含mid }
return high; }
另外,也可以用一个变量来记录当前的位置,写起来也很简单。。在传统二分基础上加两个判断
#if 1
int my_lower_bound(int *array, int low, int high, int key)
{
int mid, pos= high;
high --; while(low <= high)
{
mid = (low + high)/;
if(array[mid] >= key){
if(mid < pos)
pos = mid;
high = mid- ;
}
else{
low = mid + ;
}
}
return pos;
}
int my_upper_bound(int *array, int low, int high, int key)
{
int mid, pos= high;
high --; while(low <= high)
{
mid = (low + high)/;
if(array[mid] > key){
if(mid < pos)
pos = mid;
high = mid- ;
}
else{
low = mid + ;
}
}
return pos;
}
#endif
[STL] lower_bound和upper_bound的更多相关文章
- C++ STL lower_bound()和upper_bound()
lower_bound()和upper_bound()用法 1.在数组上的用法 假设a是一个递增数组,n是数组长度,则 lower_bound(a, a+n, x):返回数组a[0]~a[n-1]中, ...
- STL源码学习----lower_bound和upper_bound算法
转自:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html 先贴一下自己的二分代码: #include <cstdio&g ...
- STL lower_bound upper_bound binary-search
STL中的二分查找——lower_bound .upper_bound .binary_search 二分查找很简单,原理就不说了.STL中关于二分查找的函数有三个lower_bound .upper ...
- STL中的lower_bound和upper_bound的理解
STL迭代器表述范围的时候,习惯用[a, b),所以lower_bound表示的是第一个不小于给定元素的位置 upper_bound表示的是第一个大于给定元素的位置. 譬如,值val在容器内的时候,从 ...
- STL 源码分析《5》---- lower_bound and upper_bound 详解
在 STL 库中,关于二分搜索实现了4个函数. bool binary_search (ForwardIterator beg, ForwardIterator end, const T& v ...
- STL源码学习----lower_bound和upper_bound算法[转]
STL中的每个算法都非常精妙,接下来的几天我想集中学习一下STL中的算法. ForwardIter lower_bound(ForwardIter first, ForwardIter last,co ...
- [转] STL源码学习----lower_bound和upper_bound算法
http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html PS: lower_bound of value 就是最后一个 < ...
- STL之std::set、std::map的lower_bound和upper_bound函数使用说明
由于在使用std::map时感觉lower_bound和upper_bound函数了解不多,这里整理并记录下相关用法及功能. STL的map.multimap.set.multiset都有三个比较特殊 ...
- STL中的二分查找——lower_bound 、upper_bound 、binary_search
STL中的二分查找函数 1.lower_bound函数 在一个非递减序列的前闭后开区间[first,last)中.进行二分查找查找某一元素val.函数lower_bound()返回大于或等于val的第 ...
随机推荐
- 在页面上以消息束的形式同时抛出多个DialogMessage
com.sun.java.util.collections.ArrayList exceptions = new com.sun.java.util.collections.ArrayList(); ...
- SQLServer如何删除字段中的某个字符串,或者替换为空格?
sql="update Table set 字段=REPLACE ( 字段,'123' , ' ') where XXX条件"把字段中123替换为空格
- 基于IHttpAsyncHandler的TCP收发器
上一篇文章中,我们提到使用IHttpAsyncHandler来进行UDP的收发操作.由于UDP模型比较简单,所以运行没什么问题.这一篇我主要是使用IHttpAsyncHandler来进行TCP的收发操 ...
- chrome设置--disable-web-security解决跨域
我们可以通过使用chrome命令行启动参数来改变chrome浏览器的设置,具体的启动参数说明参考这篇介绍.https://code.google.com/p/xiaody/wiki/ChromiumC ...
- 给 Android 开发者的 RxJava 详解
我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...
- css margin 参数
margin 参数 margin: (1)一个参数值,将用于全部的四边. (2)两个参数值,第一个用于上-下,第二个用于左-右. (3)三个参数值,第一个用于上,第二个用于左-右,第三个用于下. (4 ...
- 如何在WPF中引用Windows.System.Forms.Integration
转自 http://www.cnblogs.com/sinozhang1988/archive/2012/11/28/2792804.html “未找到程序集 WindowsFormsIntegrat ...
- cryptdb中wrapper.lua的分析
因为cryptDB是在mysql-proxy的基础上来实现了,可以看成是为mysql-proxy添加了新的.为mysql-proxy已经为开发人员提供了相应的接口.如果开发人员只需要通过lua脚本语言 ...
- iOS -- 给model赋值时走了[self setValuesForKeysWithDictionary:dic]不走setvalue: forked:
这是一个小坑, 看看你的BaseModel的便利构造器的方法: + (__kindof BaseModel *)modelWithDic:(NSDictionary *)dic { return [[ ...
- 每天一个linux命令(8):cat 命令
cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...