如果区间有序,可以使用对数时间的算法,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 的区别...相关推荐

  1. OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()

    OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式. ...

  2. JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档

    POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...

  3. JavaScript学习笔记(十五)

    JavaScript学习笔记(十五) 事件 事件是DOM(文档对象模型)的一部分.事件流就是事件发生顺序,这是IE和其他浏览器在事件支持上的主要差别. 一.事件流 1.冒泡型事件 IE上的解决方案就是 ...

  4. MATLAB学习笔记(十五)

    MATLAB学习笔记(十五) 一.非线性方程求解与函数极值计算 1.1 非线性方程数值求解 1.2 函数极值的计算 1.2.1 无约束最优化问题 1.2.2 有约束最优化问题 一.非线性方程求解与函数 ...

  5. 学习笔记(十五)——镜像的知识点与注意事项

    学习笔记(十五)--镜像的知识点与注意事项 一.基础知识 1.SQL Server镜像只有两种模式:高安全模式和高性能模式.两种模式的主要区别在于在事务提交后的操作. 在高性能模式下,主体服务器不需要 ...

  6. JavaScript学习(四十五)—练习题

    JavaScript学习(四十五)-练习题 习题1 习题2:

  7. cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)

    cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断) https://blog.csdn.net/qq_16255321/article/details/43086 ...

  8. Cty的Linux学习笔记(十五——wget)

    Linux学习笔记--第十五篇 wget命令用于在终端中下载网络文件,格式为"wget  [参数]  下载地址" 参数: -b:后台下载模式 -P:下载到指定目录 -t:最大尝试次 ...

  9. 学习笔记(十五)——MySQL(查询)

    查询方法 下面的查询都是对单表的查询,所以先创建表tb1(下面的tb1均代表此表) create table tb1(id int,name varchar(10),age int,class var ...

  10. 【Visual C++】游戏开发笔记四十五 浅墨DirectX教程十三 深度测试和Z缓存专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8607864 作者:毛星云(浅墨 ...

最新文章

  1. python随机发牌_魔术师发牌问题 -- python实现
  2. Iterator 遍历器的简单使用
  3. 听我的!美国科技公司这样做Code Review
  4. php反序列化漏洞 freebuf,最全的PHP反序列化漏洞的理解和应用
  5. overlapped重叠IO
  6. hdu 1133 Buy the Ticket(递推+精度精算)
  7. Android-Universal-Image-Loader学习笔记(一)
  8. 优先体验重播matlab_如何为深度Q网络实施优先体验重播
  9. 如何查看CSDN积分
  10. 如果IE浏览器是IE11以下版本跳转到升级页面
  11. android文字识别apk,照片转文字识别提取apk
  12. 常见文件扩展名和它们的说明(转)
  13. 微信公众号(头部GIF动图)制作方法
  14. liinux下安装jdk
  15. 去掉mysql u0000_js对于\u0000的处理
  16. bzoj 2069 [ POI 2004 ] ZAW —— 多起点最短路 + 二进制划分
  17. CPU、程序和设备三者的关系
  18. JSON和byte[]
  19. android动态分区AB升级,Android A/B 系统升级简介
  20. 【Python3脚本分享】三个常用图片处理脚本(镜像处理,gif分解,多图合并)

热门文章

  1. Codeforces Round #503 (by SIS, Div. 2)
  2. JAVA-初步认识-第四章-其他流程控制语句
  3. Codeforces 490F Treeland Tour(离散化 + 线段树合并)
  4. Calendar(显示日期)
  5. Python自动化之socket初识
  6. 一个极其简单的在线C#IDE例子
  7. 对xhtml、dhtml、shtml的解释说明
  8. macOS安装过程中“应用副本已损坏”的解决方案
  9. Mac版正式上线剪映,适配用M1
  10. 哦?你会视频剪辑?是的。好,录用你!