C++候捷stl-视频笔记3

算法的形式

在这里插入图片描述
Cmp通常是个比大小的准则,是Functor。
算法所需的信息通常指迭代器如何移动

迭代器的分类

在这里插入图片描述
array,vector,deque它们是连续的,它们的迭代器是Random Access Iterator/随机访问迭代器
list的迭代器是Bidirectional Iterator/双向迭代器
forward_list的迭代器是Forward Iterator/前向迭代器
基于红黑树的set/multiset, map/multimap它们都是Bidirectional Iterator
基于hashtable的unordered_set, unordered_multiset, unordered_map, unordered_multimap的迭代器是双向的(Bidirectional Iterator)还是单向的(Forward Iterator),要看bucket对应的链表具体是双向链表还是单向链表。具体到STL应该是forward_iterator
在这里插入图片描述
根据分类自己打印各容器的迭代器类型字符串
在这里插入图片描述
利用c++本身typeid打印出迭代器类型
在这里插入图片描述
父类没有数据和函数,只有typedef。目的是为了让子类拥有这些别名,方便写代码
在这里插入图片描述

迭代器分类对算法的影响

在这里插入图片描述
distance:知道两个指针的距离,相当于两个指针相减。如果无法相减,只能循环

typename 的使用是为了指定 iterator_traits<_InputIterator>::difference_type 表示一个类型。iterator_traits<_InputIterator>::difference_type 是迭代器 _InputIterator 的差值类型(表示两个迭代器之间的距离),而 typename 在这里是为了明确告诉编译器这是一个类型而不是其他类型的标 识符
在这里插入图片描述
advance函数会根据iterator_category(__i)的类型选择调用不同的__advance的实现

容器迭代器的分类是基于对象(存在继承关系),而不是基于enum(枚举类型)

迭代器虽然有5种,但根据继承关系(子类is a 父类),只要实现了父类,不需要5种都实现
在这里插入图片描述
copy会不断地做检查,检查是否为某种迭代器,决定copy是否要做某些操作来加速
traits区分赋值拷贝重不重要,如复数类,没有指针不重要
在这里插入图片描述
destroy和前面类似,不断细分类型。traits区分析构函数重不重要
在这里插入图片描述
在这里插入图片描述
unique_copy例子
在这里插入图片描述
算法是模板函数,可以接收任意类型的参数,语法没法指定传入的参数类型
因此在定义模板参数名称的时候,会命名(暗示)它想要接收的类型,比如下图,distance函数想要接收的是input iterator,而sort想要接收的是random access iterator,rotate函数想要接收forward iterator等等

算法源码剖析

在这里插入图片描述
C++标准库提供的algorithm需要符合如下接口

template<typename Iterator>
std
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值