[转] STL源码学习----lower_bound和upper_bound算法
http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html
PS:
lower_bound of value 就是最后一个 < value 或者第一个 = value的位置
upper_bound of value 就是第一个 > value的位置
lower_bound的意思是一段相等的序列的头(闭)和尾(开)的位置
STL中关于二分查找的函数有三个lower_bound 、upper_bound 、binary_search 。这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数。
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函数源代码:
01.//这个算法中,first是最终要返回的位置02.int lower_bound(int *array, int size, int key)03.{04.int first = 0, middle;05.int half, len;06.len = size;07. 08.while(len > 0) {09.half = len >> 1;10.middle = first + half;11.if(array[middle] < key) {     12.first = middle + 1;          13.len = len-half-1;       //在右边子序列中查找14.}15.else16.len = half;            //在左边子序列(包含middle)中查找17.}18.return first;19.}2.upper_bound函数源代码:
01.int upper_bound(int *array, int size, int key)02.{03.int len = size-1;04.int half, middle;05. 06.while(len > 0){07.half = len >> 1;08.middle = first + half;09.if(array[middle] > key)     //中位数大于key,在包含last的左半边序列中查找。10.len = half;11.else{12.first = middle + 1;    //中位数小于等于key,在右半边序列中查找。13.len = len - half - 1;14.}15.}16.return first;17.}[转] STL源码学习----lower_bound和upper_bound算法的更多相关文章
- STL源码学习----lower_bound和upper_bound算法
		
转自:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html 先贴一下自己的二分代码: #include <cstdio&g ...
 - STL源码学习----lower_bound和upper_bound算法[转]
		
STL中的每个算法都非常精妙,接下来的几天我想集中学习一下STL中的算法. ForwardIter lower_bound(ForwardIter first, ForwardIter last,co ...
 - stl源码学习(版本2.91)--list
		
stl源码学习(版本2.91)--list 一,阅读list()构造函数的收获 1,默认构造函数的作用和被调用的时机 struct no{ no(int i){} //no(){ // std::co ...
 - 【STL源码学习】STL算法学习之二
		
第一章:前言 学习笔记,记录学习STL算法的一些个人所得,在以后想用的时候可以快速拾起. 第二章:明细 copy 函数原型: template <class InputIterator, cla ...
 - 【STL源码学习】std::list类的类型别名分析
		
有了点模板元编程的traits基础,看STL源码清晰多了,以前看源码的时候总被各种各样的typedef给折腾得看不下去, 将<list>头文件的类继承结构简化如下 #include < ...
 - 【STL源码学习】细品vector
		
第一节:vector简介 vector是一种典型的类模板,使用的时候必须进行实例化. vector的数据存储在数组上,支持随机访问迭代器,支持下标操作[]和at操作,支持手动扩容和自动容量增长. ve ...
 - 【STL源码学习】STL算法学习之三
		
第一章:前言 数量不多,用到的时候会很爽. 第二章:明细 STL算法中的又一个分类:分割:将已有元素按照既定规则分割成两部分. is_partitioned 函数原型: template <c ...
 - 【STL源码学习】STL算法学习之一
		
第一章:引子 STL包含的算法头文件有三个:<algorithm><numeric><functional>,其中最大最常用的是<algorithm>, ...
 - 【STL源码学习】STL算法学习之四
		
排序算法是STL算法中相当常用的一个类别,包括部分排序和全部排序算法,依据效率和应用场景进行选择. 明细: sort 函数原型: template <class RandomAccessIter ...
 
随机推荐
- Iis 日志文件默认路径
			
Iis 日志文件默认路径: C:\WINDOWS\system32\LogFiles
 - 快速访问WCF服务--ServiceModel 元数据实用工具 (Svcutil.exe)
			
基本定义 ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档. SvcUtil.exe ServiceModel 元数据实用工具可在 Win ...
 - 老oj2146 && Pku2135 Farm Tour
			
Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...
 - outline属性
			
outline(轮廓)用于设置元素周围的一条线,用于元素边框的外围,可起到突出元素的作用. outline属性所有浏览器都支持,如果规定了 !DOCTYPE,则 IE8 支持 outline 属性. ...
 - BZOJ 1052 覆盖问题
			
Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小 ...
 - hdu 5074 Hatsune Miku
			
http://acm.hdu.edu.cn/showproblem.php?pid=5074 题意:给你一个的矩阵score[i][j],然后给你一个数列,数列中有一些是-1,代表这个数可以换成1~m ...
 - SQL Server 全文搜索 配置、查询初体验
			
原文:SQL Server 全文搜索 配置.查询初体验 一.使用SQL Server全文搜索配置 要使用SQL Server的全文搜索服务,需要进行如下配置. 1.开启全文搜索服务: 2.开启数据库的 ...
 - <未测>源码升级安装glibc和rpm升级glibc
			
源码升级安装glibc和rpm升级glibc http://jacklin9.spaces.live.com/blog/cns!A891B52E1182AFB2!346.entry http://bl ...
 - 互联网组织的未来:剖析GitHub员工的任性之源
			
转自:http://www.php100.com/html/it/hulianwang/2015/0108/8304.html [导读] 本文为大家介绍了著名代码托管服务商GitHub的组织运转结构. ...
 - 线性代数(矩阵乘法):POJ 3233 Matrix Power Series
			
Matrix Power Series Description Given a n × n matrix A and a positive integer k, find the sum S = ...