网易首页 > 网易号 > 正文 申请入驻

【蓝因子教育】能用STL算法,绝不自己实现!

0
分享至

相信很多小伙伴对于各种算法函数,比如 find()、merge()、sort() 等都有一定的了解以及使用。

但是,不知有没有人发现,每个算法函数都至少要用一对迭代器来指明作用区间,并且为了实现自己的功能,每个函数内部都势必会对指定区域内的数据进行遍历操作。

举几个例子:

find() 函数会对指定区域的数据逐个进行遍历,确认其是否为要查找的目标元素;
merge() 函数内部也会分别对 2 个有序序列做逐个遍历,从而将它们合并为一个有序序列;
sort() 函数在对指定区域内的元素进行排序时,其底层也会遍历每个元素。

事实上,虽然这些算法函数的内部实现我们不得而知,但无疑都会用到循环结构。可以这么说,STL 标准库中几乎所有的算法函数,其底层都是借助循环结构实现的。

在此基础上,由于 STL 标准库使用场景很广,因此很多需要手动编写循环结构实现的功能,用 STL 算法函数就能完成。

再举个例子:

#include #include #include #include #include using namespace std;class Address {public: Address(string url) :url(url) {}; void display() { cout << "url:" << this->url << endl; }private: string url;};int main() { vector

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;}

// std::cout

// std::for_each

// std::string

// std::vector

程序执行结果为:

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 算法函数相比,哪种实现方式更好呢?毫无疑问,直接调用算法会更好,理由有以下几个:

✿ 算法函数通常比自己写的循环结构效率更高;

✿ 自己写循环比使用算法函数更容易出错;

✿ 相比自己编写循环结构,直接调用算法函数的代码更加简洁明了。

✿ 使用算法函数编写的程序,可扩展性更强,更容易维护;

后面 3 个理由相信读者很容易理解,接下来重点讲一下“为什么算法函数的效率更高”。

为什么STL算法效率更高

仍以上面程序为例,如下是我们手动编写的循环代码:

for (auto it = adds.begin(); it != adds.end(); ++it) {
(*it).display();
}

此段代码中,每一次循环都要执行一次 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标准库官网

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
江西一光棍娶个疯女人生了8个娃,妻子清醒后十辆豪车开到家门口

江西一光棍娶个疯女人生了8个娃,妻子清醒后十辆豪车开到家门口

夜阑故事集
2025-09-09 17:50:04
同一天内!广东8名干部被查!

同一天内!广东8名干部被查!

知肇分子
2025-09-18 22:42:01
郎平指导今天回到北京!郎导穿一身休闲装,笑容满面,气色非常好

郎平指导今天回到北京!郎导穿一身休闲装,笑容满面,气色非常好

可乐谈情感
2025-09-19 12:32:48
杨瀚森NBA增肌3.4%超迅猛,体脂率降至7.3%,超申京直逼约基奇

杨瀚森NBA增肌3.4%超迅猛,体脂率降至7.3%,超申京直逼约基奇

二哥聊球
2025-09-18 10:32:17
萧敬腾陪老婆度假,对嘴亲吻太浪漫,52岁林有慧脖子皱巴巴真显老

萧敬腾陪老婆度假,对嘴亲吻太浪漫,52岁林有慧脖子皱巴巴真显老

小咪侃娱圈
2025-09-19 14:46:34
23岁男中介带看房9分钟,女客户报警称被强奸,6个G视频揭露真相

23岁男中介带看房9分钟,女客户报警称被强奸,6个G视频揭露真相

悬案解密档案
2025-05-09 17:03:55
广东初二男孩被5名同学围殴,父亲抡起铁棍将其中一名活活打死,判决结果出来后,网友不淡定了…

广东初二男孩被5名同学围殴,父亲抡起铁棍将其中一名活活打死,判决结果出来后,网友不淡定了…

谭老师地理工作室
2025-03-11 12:58:06
当色情行业赚不到钱时,经济真的该警惕了?

当色情行业赚不到钱时,经济真的该警惕了?

流苏晚晴
2025-09-17 18:05:22
盘点上海团餐企业绿捷:日供60万份学生餐,8月中标20多所学校

盘点上海团餐企业绿捷:日供60万份学生餐,8月中标20多所学校

上游新闻
2025-09-18 18:12:10
玄学提醒:一个人要发财了,老天就会派这三种“信号”来给你报喜

玄学提醒:一个人要发财了,老天就会派这三种“信号”来给你报喜

诗词中国
2025-09-15 16:29:46
广州的廖一帆爸爸火了,因为他揭开了家委会的真相

广州的廖一帆爸爸火了,因为他揭开了家委会的真相

清晖有墨
2025-09-05 19:24:18
图书馆事件迎来大结局!杨景媛放已忏悔,她可能会放弃二审

图书馆事件迎来大结局!杨景媛放已忏悔,她可能会放弃二审

平老师666
2025-09-19 12:21:17
搞笑经典冷笑话,上大学第一天同寝室一班花就叹气说家里卖了头牛来上大学,我们一听心里都有些不忍!

搞笑经典冷笑话,上大学第一天同寝室一班花就叹气说家里卖了头牛来上大学,我们一听心里都有些不忍!

天天明星
2025-09-18 11:52:50
台湾只有2340万人,上半年却创造3万亿GDP,与福建省相比什么水平

台湾只有2340万人,上半年却创造3万亿GDP,与福建省相比什么水平

科普100克克
2025-09-18 20:13:53
希腊船王女继承人香消玉殒,战胜癌症死于虫咬,英医疗机构遭质疑!

希腊船王女继承人香消玉殒,战胜癌症死于虫咬,英医疗机构遭质疑!

新民周刊
2025-09-19 09:08:40
于朦胧最后一夜全程复盘:恐高症为何坠楼?第二天有工作为何喝酒?朋友为何集体沉默?

于朦胧最后一夜全程复盘:恐高症为何坠楼?第二天有工作为何喝酒?朋友为何集体沉默?

阿废冷眼观察所
2025-09-19 11:38:51
梁晓声:中国富豪家庭92%将子女送往英美私校,既规避教育内卷...

梁晓声:中国富豪家庭92%将子女送往英美私校,既规避教育内卷...

清风拂心
2025-09-14 13:15:08
阿斯:皇马后防再遭集体停赛,上赛季的魔咒再度来袭

阿斯:皇马后防再遭集体停赛,上赛季的魔咒再度来袭

雷速体育
2025-09-19 13:55:01
最新战报!国羽3胜3负,NO.1轰21-8,1姐输外战,混双会师决赛?

最新战报!国羽3胜3负,NO.1轰21-8,1姐输外战,混双会师决赛?

刘姚尧的文字城堡
2025-09-19 15:25:21
上海市的人均养老金到底是多少?6000元位列多少名次?

上海市的人均养老金到底是多少?6000元位列多少名次?

小鹿姐姐情感说
2025-09-19 11:58:54
2025-09-19 16:07:00
原画在线课堂vv
原画在线课堂vv
一家有温度的原画教育机构
864文章数 1关注度
往期回顾 全部

科技要闻

直击iPhone 17开售:消费者偏爱银色橙色

头条要闻

中美元首被传今天将通话 外交部回应

头条要闻

中美元首被传今天将通话 外交部回应

体育要闻

不会短跑的牙买加人,集体跳槽土耳其

娱乐要闻

关晓彤生日 仅闫妮和化妆师撑场祝福?

财经要闻

"矿霸"填埋万吨危废 当地政府成立调查组

汽车要闻

对话周光:一个技术理想主义者的“蜕变”

态度原创

亲子
游戏
本地
公开课
军事航空

亲子要闻

为什么说:孩子是你轮回,未完的自己?

玩家回忆泄密GTA6的未成年黑客:终身监护太惨了!

本地新闻

云游中国|谁懂!在天下第一关拍到史诗感大片

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

卫星图像显示以军坦克集结加沙城周围

无障碍浏览 进入关怀版