到目前为止,我们已经学习了所有容器和大部分模板函数,读者是否遇到过这样的问题:算法头文件<algorithm>和容器的成员函数”撞衫“了,该选择哪一个好呢?比如查找函数,算法库中提供了一个模板函数find(),所有的关联式容器都有这个同名的成员函数find(),都能够判断是否存在该元素:
#include<iostream>
#include<vector>
#include<map>
#include<iterator> //使用迭代器函数进行切割,复习前面知识 next(it,n)
#include<algorithm>//包含算法头文件!
using namespace std;
/*<algorithm>提供了find()函数,而map容器自身就有find()成员函数*/
void test()
{
cout << "判断是否存在元素key==数据结构教程&&value==https://www.dotcpp.com/course/ds/\n";
map<string,string>mp{
{"C++教程","https://www.dotcpp.com/course/cpp/"},
{"C语言教程","https://www.dotcpp.com/course/c/"},
{"计算机二级C语言","https://www.dotcpp.com/course/erjic/"},
{"数据结构教程","https://www.dotcpp.com/course/ds/"},
{"Python教程","https://www.dotcpp.com/course/python/"},
{"Java教程","https://www.dotcpp.com/course/java/"}
};//初始化列表
/*注意pair中的键在map中要求是const修饰*/
pair<const string,string> t{"数据结构教程","https://www.dotcpp.com/course/ds/"};
auto ds_algorithm=find(mp.begin(),mp.end(),t);
if(ds_algorithm!=mp.end())cout << "存在!\n";
auto ds_member = mp.find("数据结构教程");
if(ds_member!=mp.end())cout << "存在!\n";
}
int main(){
system("title dotcpp.com");
test();
return 0;
}编译结果如下:

可以看到使用算法头文件的find()模板函数和map容器提供的成员函数find()都能够找到"元素key==数据结构教程&&value==https://www.dotcpp.com/course/ds/\n"。
所以在解决类似需求时,我们该使用哪一个函数呢?
其实,如果我们遇到算法头文件<algorithm>和容器的成员函数重名时,我们第一反应是使用容器提供的函数而不是算法提供的模板函数,因为容器提供的成员函数能够更好地耦合容器,效率更高!
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程