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

简介:

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呢?请给出这种编程方式可能导致的三种隐晦错误。列出三个应用,你特别讨厌发现这种代码。

相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
60 4
|
1月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
24 2
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
|
1月前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
1月前
|
机器学习/深度学习 人工智能 Rust
MindSpore QuickStart——LSTM算法实践学习
MindSpore QuickStart——LSTM算法实践学习
40 2
|
1月前
|
存储 编译器 C语言
C++类与对象深度解析(一):从抽象到实践的全面入门指南
C++类与对象深度解析(一):从抽象到实践的全面入门指南
49 8
|
1月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
39 1
|
1月前
|
机器学习/深度学习 算法 数据建模
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
30 0
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
25 0
下一篇
无影云桌面