算法的形式
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