16.3 通用搜索算法f?ind_if()

其实我们并没有那么经常地需要查找一个特定值。我们通常更感兴趣的是在序列中查找符合某种标准的值。如果能够允许我们自己定义查找标准,这样的f?ind操作就更为有用。例如,我们也许希望查找大于42的值,也许希望在不考虑大小写的情况下比较字符串,也许希望找到第一个奇数值,也许希望查找一个地址域值为“17 Cherry Tree Lane”的记录。

根据用户提供的标准进行查找的标准算法是f?ind_if():

显然(当你比较源码时),f?ind_if()的实现与f?ind()的实现很相似,除了前者使用!pred(*f?irst)而非*f?irst != val;即,一旦断言pred()成立,f?ind_if()就立即停止搜索,而不是当一个元素等于给定值时停止。

断言是一种返回true或false的函数。显然,f?ind_if()要求断言接受一个参数,这样就可以说pred(*f?irst)。我们可以容易地编写一个断言来检查值的某种属性,例如“字符串是否包含字母x?”“值是否大于42?”“数是否是奇数?”例如,我们可以通过如下方式在int的向量中查找第一个奇数:

在这个f?ind_if()调用中,f?ind_if()会对每一元素调用odd()直至它找到了第一个奇数。注意,当你将一个函数作为参数传递时,你不应在它的名字后面加上(),因为这样做会调用它。

类似地,我们可以查找一个链表中第一个大于42的元素:

最后这个例子并不是十分令人满意。如果我们下次想找出大于41的元素该怎么办呢?我们不得不编写一个新的函数。那查找大于19的元素又如何?又要编写另一个函数。应该有更好的方法!

如果我们想要与任意的值v进行比较,我们需要某种方法令v成为f?ind_if()的断言的一个隐含参数。我们可以尝试如下(选择v_val作为变量名以避免与其他名称发生冲突):

哟!我们相信编写这段代码的人最终能得到想要的结果,但我们很同情代码的用户和维护者。再次强调:应该还有更好的方法!

试一试

为什么我们讨厌这样使用v呢?请给出这种编程方式可能导致的三种隐晦错误。列出三个应用,你特别讨厌发现这种代码。

C++程序设计:原理与实践(进阶篇)16.3 通用搜索算法f?ind_if()相关推荐

  1. 编码原则实例------c++程序设计原理与实践(进阶篇)

    编码原则: 一般原则 预处理原则 命名和布局原则 类原则 函数和表达式原则 硬实时原则 关键系统原则 (硬实时原则.关键系统原则仅用于硬实时和关键系统程序设计) (严格原则都用一个大写字母R及其编号标 ...

  2. C++学习书籍推荐《C++程序设计原理与实践》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计原理与实践>是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述.书中全面地介绍了 ...

  3. VS2017下安装fltk库——C++程序设计原理与实践图形编程指南

    VS2017下安装fltk库--C++程序设计原理与实践图形编程指南 前言 最近,我在学习<C++程序设计原理与实践>(原书第一版)遇到了安装图形库的问题,我花了两天时间,通过各种途径查找 ...

  4. C++程序设计原理与实践电子书pdf下载

    C++程序设计原理与实践下载链接: ​​​​​​​https://pan.baidu.com/s/1AwGSYoAiyeEGdgBoGNqGpA​​​​​​​ 提取码获取方式:关注下面微信公众号,回复 ...

  5. C++之父名著——C++程序设计原理与实践 英文原版

    C++之父名著--C++程序设计原理与实践 英文原版 转载于:https://www.cnblogs.com/gavinhughhu/archive/2010/08/18/1801986.html

  6. C++程序设计原理与实践(C++之父最作力作) 中文PDF高清版下载

    C++程序设计原理与实践(C++之父最作力作) 中文PDF高清版下载 转载于:https://www.cnblogs.com/gavinhughhu/archive/2010/09/08/182113 ...

  7. ViewDragHelper(二)- 源码及原理解读(进阶篇)

    声明:本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本篇为该系列的第二篇,侧重讲解ViewDragHelper 的实现原理和源码逻辑,以及它所提供的Callback. 目录 Vi ...

  8. Kafka核心设计与实践原理总结:进阶篇

    作者:未完成交响曲,资深Java工程师!目前在某一线互联网公司任职,架构师社区合伙人! kafka作为当前热门的分布式消息队列,具有高性能.持久化.多副本备份.横向扩展能力.我学习了<深入理解K ...

  9. c++程序设计原理与实践_课程思政水资源系统优化原理与方法课程思政元素的探索...

    案例说明+课程基本信息 案例说明: 水资源系统优化原理与方法的思政教育目标是要让学生建立一种科学思维方式,用辩证和历史唯物主义的观点去观察和分析问题,培养其规则意识和约束观念,以社会主义核心价值观来进 ...

最新文章

  1. python刷新页面_Python模拟浏览器爬取天猫信息
  2. C++字符串反转(C++11)
  3. Arraylist、HashSet去重复 treeSet排列实现方法 HashMap遍历取值
  4. 乱谈数学--我理解的函数极限运算
  5. 洛谷 - P2944 [USACO09MAR]Earthquake Damage 2 G(最小割)
  6. springboot日志可视化_spring boot面试问题集锦
  7. 开放重定向(Open Redirection)
  8. centos crontab环境变量问题
  9. 浏览器渲染原理 记录备份
  10. 【UVA12169】不爽的裁判
  11. 哈密顿图 哈密顿回路 哈密顿通路(Hamilton)
  12. 西门子触摸屏数据历史数据记录_西门子触摸屏参数跟数据简单说明
  13. linux svn更新到指定版本
  14. 图片生成链接最简单的方法
  15. 怎么更改Visual Studio项目名字
  16. 《隐私计算法律适用规则报告》:隐私计算如何助力数据合规
  17. MCEN90008 FLUID DYNAMICS
  18. 2.03.05 原型与原型链
  19. VS2017安装Spy++工具
  20. Elasticsearch: analyzer

热门文章

  1. CocoaPods使用中的invalid byte sequence in US-ASCII错误
  2. 硬件加密框架ocf cryptodev-linux介绍
  3. 【信息资源管理】第一章:信息资源管理基础
  4. java 中的多种判空方式
  5. dy\ks直播间人气挂粉
  6. QT5 ubuntu虚拟机下远程连接AGX或arm嵌入式开发板
  7. 互联网晚报 | 05月11日 星期三 | 贝壳找房启动新一轮裁员;苹果宣布停产iPod touch;朴新教育否认“宣布破产”...
  8. 分享自己的 快马进程管理器 2008版
  9. Python玩微信头像组字
  10. Skype打不开,双击没反应?(win7)