[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的第 ...
随机推荐
- U3D physics总结
物理系统基于collider, 没有collider的物体不会发生任何主动和被动的物理交互,也不会产生trigger相关消息. 当且仅当A和B都有碰撞体时,两者才有可能发生交互,才有可能产生trigg ...
- [转]World Wind Java开发之四——搭建本地WMS服务器
在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...
- Java Web利用POI导出Excel简单例子
采用Spring mvc架构: Controller层代码如下 @Controller public class StudentExportController{ @Autowired private ...
- [CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map
13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the numbe ...
- IM架构(一)JSQMessagesViewController
JSQMessagesViewController 是 Jesse Squires 开发的一个消息界面的 UI 库.
- aptana studio 3汉化方法 及支持jquery的方法
之前看弦哥的 Asp.Net大型项目实践系列第二季(一)哥欲善其事,必先利其器 看到他介绍了aptana,好像用来学习js是个好工具... 因为不论你写什么,都会提示你它在各个浏览器中是否被支持... ...
- 20145208 实验五 Java网络编程
20145208 实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务 ...
- VS2010下配置使用OpenGL的glut库
我已在我机上测试成功,机装VS2010! 在win7(windows7 ultimate SP1)下成功安装VS2010(Visual Studio 2010 ultimate x86). 下载glu ...
- Jenkins进阶系列之——11修改Jenkins用户的密码
说明:本方法仅适用于jdk6+.tomcat6+和Jenkins专有用户数据库的Jenkins! 很多童鞋在使用jenkins的时候忘记密码了,然后各种蛋疼.最近闲着无事,折腾了下.好了,闲话少扯. ...
- js除法四舍五入保留小数点后两位写法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...