能用STL算法,绝不自己实现!
举几个例子,find() 函数会对指定区域的数据逐个进行遍历,确认其是否为要查找的目标元素;merge() 函数内部也会分别对 2 个有序序列做逐个遍历,从而将它们合并为一个有序序列;sort() 函数在对指定区域内的元素进行排序时,其底层也会遍历每个元素。
事实上,虽然这些算法函数的内部实现我们不得而知,但无疑都会用到循环结构。可以这么说,STL 标准库中几乎所有的算法函数,其底层都是借助循环结构实现的。
在此基础上,由于 STL 标准库使用场景很广,因此很多需要手动编写循环结构实现的功能,用 STL 算法函数就能完成。举个例子:
#include iostream // std::cout #include algorithm // std::for_each #include string // std::string #include vector // std::vector #include functional using namespace std; class Address { public: Address(string url) :url(url) {}; void display() { cout url: this- url endl; private: string url; int main() { vector Address adds{ Address( http://c.biancheng.net/stl/ ), Address( http://c.biancheng.net/java/ ), Address( http://c.biancheng.net/python/ ) }; //手动编写循环结构 cout first:/n for (auto it = adds.begin(); it != adds.end(); ++it) { (*it).display(); //调用 STL 标准库中的算法函数 cout second:/n for_each(adds.begin(), adds.end(), mem_fun_ref( Address::display)); return 0; }
程序执行结果为:
first:
url:http://c.biancheng.net/stl/
url:http://c.biancheng.net/java/
url:http://c.biancheng.net/python/
second:
url:http://c.biancheng.net/stl/
url:http://c.biancheng.net/java/
url:http://c.biancheng.net/python/
可以看到,对于输出 adds 容器中存储的元素,除了可以手动编写循环结构实现,还可以使用 STL 标准库提供的 for_each() 函数。
那么,手动编写循环结构和调用 STL 算法函数相比,哪种实现方式更好呢?毫无疑问,直接调用算法会更好,理由有以下几个:
}
此段代码中,每一次循环都要执行一次 end() 方法,事实上该方法并不需要多次调用,因为它的值自始至终都没有发生改变。也就是说,end() 方法只需要调用一次就够啦,for_each() 函数就对这一点进行了优化:
for_each(adds.begin(), adds.end(), mem_fun_ref( Address::display));
可以看到,通过将 end() 方法作为参数传入 for_each() 函数,该方法只执行了 1 次。当然,这也仅是众多优化中的一处。事实上,STL 标准库的开发者对每个算法函数的底层实现代码都多了优化,使它们的执行效率达到最高。
有读者可能会说,难道我们自己对循环结构进行优化不行吗?可以,但是其执行效率仍无法和算法函数相提并论。
一方面,STL 开发者可以根据他们对容器底层的了解,对整个遍历过程进行优化,而这是我们难以做到的。以 deque 容器为例,该容器底层会将数据存储在多个大小固定的连续空间中。对于这些连续空间的遍历,只有 STL 开发者才知道这些连续空间的大小,才知道如何控制指针逐个遍历这些连续空间。
另一方面,某些 STL 函数的底层实现使用了复杂的科学计算方法,并不是普通 C++ 程序员能驾驭的。例如,在实现对某个序列进行排序时,我们很难编写出比 sort() 函数更高效的代码。
总之,STL 开发者比使用者更了解内部的实现细节,他们会充分利用这些知识来对算法进行优化。
当然,只有熟悉 STL 标准库提供的函数,才能在实际编程时想到使用它们。作为一个专业的 C++ 程序员,我们必须熟悉 STL 标准库中的每个算法函数,并清楚它们各自的功能。
C++ STL 标准库中包含 70 多个算法函数,如果考虑到函数的重载,大约有 100 多个不同的函数模板。本章仅介绍一些常用的算法函数,如果想了解全部的 STL 算法,读者可参考 C++ STL标准库官网。
相关文章
- 【万字专栏总结】离线强化学习(OfflineRL)总结(原理、数据集、算法、复杂性分析、超参数调优等)
- c语言 银行家算法(完整代码实现)
- 25行代码实现完整的RSA算法
- 传统波束形成的算法实现「建议收藏」
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(二)[通俗易懂]
- 八大排序算法(C语言实现)
- 基于MeanShift的目标跟踪算法及实现
- Paxos算法详解
- 快速选择算法Golang实现
- 收藏 | 从SGD到NadaMax,深度学习十种优化算法原理及实现
- 算法与数据结构之最大/最小堆
- 推荐算法的三大研究热点
- Python实现排列组合算法
- java实现Apriori算法——频繁项集的计算
- 前后端联调-前端不能识别雪花算法id解决方案
- 机器学习算法常用指标总结
- 论文拾萃 | PISTS算法求解obnoxious p-median problem (附Python代码)
- 数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病|附代码数据
- 数据结构实验之图论十一:AOE网上的关键路径【Bellman_Ford算法】
- 【干货书】时间序列算法导论:使用Python实现机器学习和深度学习技术
- 可信生物识别:隐私保护增强算法实现、技术性能与应用合规全方位透视,11月29日晚7点见
- 死磕算法!35 篇算法设计实例+6 本必读书打包送你
- Java数据结构学习笔记之二Java数据结构与算法之栈(Stack)实现详解编程语言
- Raft算法在Redis中的实现(raftredis)
- java 根据经纬度坐标计算两点的距离算法详解编程语言
- LRU算法详解编程语言
- C++ stable_sort(STL stable_sort)排序算法详解
- 百度蓝天算法升级 打击网站目录买卖?
- MySQL函数实现递归算法(mysql函数递归)
- KMP算法在Oracle环境中的应用实践(kmp oracle实现)
- Oracle 4舍五入算法实现详解(oracle 4舍五入)
- 基于稀疏图上的Johnson算法的详解
- C++实现矩阵原地转置算法