Effective_STL 学习笔记(四十五) 注意 count、find、binary_search、lower_bound、upper_bound 和 equal_range 的区别...
如果区间有序,可以使用对数时间的算法,binary_search、lower_bound、upper_bound 和 equal_range
如果迭代器没有划分一个有序区间,只能用线性时间的算法 count、count_if、find 和 find_if
cout 回答: 是否存在这个值,如果有,那么存在几分拷贝?
find 回答: 是否存在,如果有,那么它在哪?
count 返回零或一个正数,所以把非零转换为 true 而把零转化为 false
1 if( count(lw.begin(), lw.end(), w) ) // 检查是否有w在lw中 2 . . .
使用 find 的算法可以在搜索到就停止,不必继续搜索
1 if( find( lw.begin(), lw.end(), w ) != lw.end() ) 2 . . . // 找到了 3 else 4 . . . // 没找到
想获得区间中的第一个等于该值的对象,就得使用 find:
1 list<Widget>::iterator i = find( lw.begin(), lw.end(), w ); 2 if( i != lw.end() ) 3 . . . // 找到了,i 指向第一个 4 else 5 . . . // 没有找到
有序区间搜索算法是线性时间的 binary_search、lower_bound、upper_bound 和 equal_range 是对数时间的,从无序区间迁移到有序区间导致另一个迁移:从使用相等来判断两个值是否相同到使用等价来判断。
binary_searh 回答: 它在吗?它的回答只能是是或者不是
1 if( binary_search( lw.begin(), lw.end(), w ) ) 2 . . . // w 在 lw 中 3 else 4 . . . // w 不在 lw 中
如果要回答: 它在吗,如果是,那么在哪里? 你就需要 equal_range,但可能想要 lower_bound
lower_bound 回答: 它在吗?如果是,第一个拷贝在哪?如果不是,它将在哪里?
lower_bound 要检测返回值是否等于 end 迭代器,还要检测标识对象是都为找的值
1 vector<Widget>::iterator i = lower_bound( vw.begin(), vw.end(), w ); 2 if( i != vw.end() && *i == w ) // 这有一个 bug 3 . . . 4 else 5 . . .
大多数情况能通过,bug 在于 *i == w 这是一个相等测试,而 lower_bound 用的是等价测试
equal_range 返回一对迭代器,第一个等于 lower_bound 返回的迭代器,第二个等于 upper_bound 返回的迭代器。因此,equal_range 返回了一对划分出了和你要搜索的值的等价的区间的迭代器。
1 vector<Widget> vw; 2 . . . 3 sort( vw.begin(), vw.end() ); 4 typedef vector<Widget>::iterator VWIter; 5 typedef pair<VWIter, VWIter> VWIterPair; 6 VWIterPair p = equal_range( vw.begin(), vw.end(), w ); 7 if( p.first != p.second ) 8 . . . // 找到了,p.first 指向第一个,p.second 指向第二个 9 else 10 . . . // 没找到 p.first 和 p.second 都指向搜索值的插入位置
equal_range 返回的东西是两个迭代器,对他们作 distance 就等于区间中对象的数目,也就是等价于要寻找的值的对象。equal_range 不光完成了搜索有序区间的任务,而且完成了计数(distance())
1 cout<<"There are"<< distance(p.first, p.second) <<"elements in vw";
对于标准关联容器(set、multiset、map 和 multimap)使用它们成员函数代替同名算法,没有 binary_search 对应的成员函数,对于 set 或者 map 使用 count 的惯用法,对于 multiset 和 multimap 使用 find 比 count 好。
转载于:https://www.cnblogs.com/kidycharon/p/10053466.html
Effective_STL 学习笔记(四十五) 注意 count、find、binary_search、lower_bound、upper_bound 和 equal_range 的区别...相关推荐
- OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()
OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式. ...
- JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档
POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...
- JavaScript学习笔记(十五)
JavaScript学习笔记(十五) 事件 事件是DOM(文档对象模型)的一部分.事件流就是事件发生顺序,这是IE和其他浏览器在事件支持上的主要差别. 一.事件流 1.冒泡型事件 IE上的解决方案就是 ...
- MATLAB学习笔记(十五)
MATLAB学习笔记(十五) 一.非线性方程求解与函数极值计算 1.1 非线性方程数值求解 1.2 函数极值的计算 1.2.1 无约束最优化问题 1.2.2 有约束最优化问题 一.非线性方程求解与函数 ...
- 学习笔记(十五)——镜像的知识点与注意事项
学习笔记(十五)--镜像的知识点与注意事项 一.基础知识 1.SQL Server镜像只有两种模式:高安全模式和高性能模式.两种模式的主要区别在于在事务提交后的操作. 在高性能模式下,主体服务器不需要 ...
- JavaScript学习(四十五)—练习题
JavaScript学习(四十五)-练习题 习题1 习题2:
- cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)
cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断) https://blog.csdn.net/qq_16255321/article/details/43086 ...
- Cty的Linux学习笔记(十五——wget)
Linux学习笔记--第十五篇 wget命令用于在终端中下载网络文件,格式为"wget [参数] 下载地址" 参数: -b:后台下载模式 -P:下载到指定目录 -t:最大尝试次 ...
- 学习笔记(十五)——MySQL(查询)
查询方法 下面的查询都是对单表的查询,所以先创建表tb1(下面的tb1均代表此表) create table tb1(id int,name varchar(10),age int,class var ...
- 【Visual C++】游戏开发笔记四十五 浅墨DirectX教程十三 深度测试和Z缓存专场
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8607864 作者:毛星云(浅墨 ...
最新文章
- python随机发牌_魔术师发牌问题 -- python实现
- Iterator 遍历器的简单使用
- 听我的!美国科技公司这样做Code Review
- php反序列化漏洞 freebuf,最全的PHP反序列化漏洞的理解和应用
- overlapped重叠IO
- hdu 1133 Buy the Ticket(递推+精度精算)
- Android-Universal-Image-Loader学习笔记(一)
- 优先体验重播matlab_如何为深度Q网络实施优先体验重播
- 如何查看CSDN积分
- 如果IE浏览器是IE11以下版本跳转到升级页面
- android文字识别apk,照片转文字识别提取apk
- 常见文件扩展名和它们的说明(转)
- 微信公众号(头部GIF动图)制作方法
- liinux下安装jdk
- 去掉mysql u0000_js对于\u0000的处理
- bzoj 2069 [ POI 2004 ] ZAW —— 多起点最短路 + 二进制划分
- CPU、程序和设备三者的关系
- JSON和byte[]
- android动态分区AB升级,Android A/B 系统升级简介
- 【Python3脚本分享】三个常用图片处理脚本(镜像处理,gif分解,多图合并)