C++ Essentials 之 lower_bound 和 upper_bound 的比较函数格式不同
第一次注意到这个问题。
cppreference 上的条目:
lower_bound
upper_bound
C++17 草案 N4659
lower_bound
template<class ForwardIterator, class T>
ForwardIterator
lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
template<class ForwardIterator, class T, class Compare>
ForwardIterator
lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
Requires: The elements e
of [first, last)
shall be partitioned with respect to the expression e < value
or comp(e, value)
.
Returns: The furthermost iterator i
in the range [first, last]
such that for every iterator j
in the
range [first, i)
the following corresponding conditions hold: *j < value
or comp(*j, value) != false
.
upper_bound
template<class ForwardIterator, class T>
ForwardIterator
upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
template<class ForwardIterator, class T, class Compare>
ForwardIterator
upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
Requires: The elements e
of [first, last)
shall be partitioned with respect to the expression !(value < e)
or !comp(value, e)
.
Returns: The furthermost iterator i
in the range [first, last]
such that for every iterator j
in the
range [first, i)
the following corresponding conditions hold: !(value < *j)
or comp(value, *j) == false
.
分析
为何如此设计?
这是有原因的。
lower_bound
和 upper_bound
的比较函数都只能判定严格偏序。也就是说 comp(value, j)
只能判定 value < *j
,而不能判定 value == *j
和 *j < value
。
如果 upper_bound
的比较函数只能判定 *j < value
,那么对于一个有序的全序序列,它就无法二分找出大于 value
的第一个元素所在的位置(iterator)。原因在于对于任意 iterator j
,判定 *j > value
根本不可能。
C++ Essentials 之 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中的每个算法都非常精妙, ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一 ...
- vector的插入、lower_bound、upper_bound、equal_range实例
对于这几个函数的一些实例以便于理解: #include <cstdlib> #include <cstdio> #include <cstring> #includ ...
- 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 ...
- lower_bound和upper_bound算法
参考:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html ForwardIter lower_bound(ForwardIte ...
- lower_bound 和 upper_bound
Return iterator to lower bound Returns an iterator pointing to the first element in the range [first ...
- 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 就是最后一个 < ...
随机推荐
- 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)
点此看题面 大致题意: 给你\(N\)个单词,请你求出每一个单词在这\(N\)个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. \(AC\)自动机 这是一道\(AC\)自动机的简 ...
- python psutil 编译中断。 error: command 'gcc' failed with exit status 1
error info [root@chenbj psutil-2.0.0]# python setup.py install running install running bdist_egg run ...
- ES6 Promise用法详解
What is Promise? Promise是一个构造函数,接受一个参数(Function),并且该参数接受两个参数resolve和reject(分别表示异步操作执行成功后的回调函数.执行失败后的 ...
- 什么是SAD,SAE,SATD,SSD,SSE,MAD,MAE,MSD,MSE?
SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即绝对误差和 SATD(Sum of Absolute Transformed Di ...
- expect用法举例
1 expect -c 'spawn su - oracle -s check_tablespace.shexpect "Password:"send "oracle\n ...
- 全文检索ES 服务启动和关闭
nohup ./elasticsearch & 可以后台开启elasticsearch服务 ps-ef列出所有进程 ps-ef | grep elastic...查找elastic..的进程 ...
- hive数据的导入导出方式
导入方式 1.load方式 load data local inpath 'local_path' into table tb_name; 从本地复制了文件到表的路径下 应用场景:大部分的使用,文件几 ...
- Poj3061Subsequence
A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, a ...
- 笔记-python-__new__()
笔记-python-__new__() 1. __new__() __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前. 验证代码: class Person(obj ...
- EF上下文对象创建之线程内唯一
在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,那么会造成数据混乱,每次创建的对象执行相应的数据库操作,此同时,其他的EF对象内获得的数据可能已经是“过期”的了.即这个数据已经变动 ...