C++标准库与内核分析第三讲(六大部件源码分析)

本文深入探讨C++标准库中的算法部分,分析不同迭代器类型对算法效率的影响,如distance和advance函数。同时,介绍了仿函数(functors)的概念及其在算法中的作用,以及适配器(Adapters)如何作为中间件与算法和容器协同工作。文章通过实例展示了sort、accumulate、for_each等算法的使用,并强调了二分查找前需先排序的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.准备工作

在第二讲中主要讲到标准库中容器的源码,这里主要讲一讲标准库算法。如下
通常算法会有第二个版本,名称相同,参数不同,如下算法,第一个有两个参数,第二个有三个参数,其中第三个参数,就是允许我们用户自己传入一个准则。例如排序算法,我们就可以传入一个准则,即如何比较大小。Algorithms如果需要知道容器的某一些性质,则iterators必须进行回答,如果iterators没办法回答,则编译器编译到这一行语句的时候就会出错。
这里写图片描述
前面我们已经提到迭代器应该提供五个相关类型,由于搭配着算法,所以我们来了解在分类这件事情上是如何设计的。我们看看容器的性质,vector,array是连续空间,所以其迭代器类型为random_access,而deque虽然是分段连续,但是对外号称连续所以其迭代器类型也应为random_access.而list 为双向链表,所以其迭代器类型为bidirectional_iteration,而forword_list则为forward_iterator.至于set,multi_set,map和multi_map虽然我们看不出来,但是他们底部是以红黑书做支撑的,红黑树是双向的,所以其迭代器类型为bidirectional_iteration。其次unordered_set,unordered_multiset,unordered_map,unordered_multimap我们知道其底部是以哈希表做支撑的,他是一个链表,所以取决于这个链表是双向链表还是单向链表,这样就可以判断迭代器的类型。至于input_iterator_tag和output_iterator_tag则是输入输出流的迭代器类型,这两个很特别。
这里写图片描述

现在我们来看看istream_iterator的iterator_category..不同版本的编译器做法不一样,但是他们提供的接口必须一致。我们可以从下面的源代码中看到,istream_iterator中明确定义了iterator的类型为input_iterator。ostream_iterator类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值