到目前为止,我们已经学习了所有容器和大部分模板函数,读者是否遇到过这样的问题:算法头文件<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()

可以看到使用算法头文件的find()模板函数和map容器提供的成员函数find()都能够找到"元素key==数据结构教程&&value==https://www.dotcpp.com/course/ds/\n"。

所以在解决类似需求时,我们该使用哪一个函数呢?

其实,如果我们遇到算法头文件<algorithm>和容器的成员函数重名时,我们第一反应是使用容器提供的函数而不是算法提供的模板函数,因为容器提供的成员函数能够更好地耦合容器,效率更高!

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)