0. C++标准库的算法是什么?
容器,是个类模板
算法,是个函数模板
迭代器,是个类模板
仿函数,是个类模板
适配器,是个类模板
分配器,是个类模板
算法(Algorithm)看不见容器,对其一无所知,所以,它所需要的一切信息都必须从迭代器(Iterator)。
算法通过询问迭代器一些问题,来了解一些信息(比如,迭代器如何“走”),迭代器必须能够回答算法的所有提问,才能搭配该算法完成所有的操作。
1. 迭代器的分类
GNU中迭代器源码如下:
迭代器有五种分类:
- input_iterator_tag
- output_iterator_tag
- forward_iterator_tag:只能往前走(forward_list)
- bidirectional_iterator_tag:可以前后走,但不能跳(list,rb_tree(set、map、multiset、multimap))
- random_access_iterator_tag:可以跳(array、vector、deque)
为什么用继承来表示,而不用1,2,3…这种整数来表示?
代码可以写的很漂亮~
2.迭代器分类对算法的影响
比如,标准库中的copy
函数,对不同类型的迭代器,有不同的加速策略,无所不用其极。
标准库中的模板函数,虽然传进来的参数一般可以是任意类型,但是源代码中有一些暗示,比如sort
函数:
它的模板参数名字可以任意,但是这里用了RandomAccessIterator
,就是暗示使用代码的人,这里最好传进来一个这个类型的迭代器,否则我也会让你运行,但是到后边编译的时候会出错。
3. 仿函数
仿函数,写法上像函数调用,其实是一个类的小括号重载。
4. 适配器
适配器,是为了统一某一些函数模板而产生的,简单来说,一个array容器,就是内含了一个基本的c语言数组,包装了一下,方便标准库中的模板方法调用,这个封装操作,就可以说是一个适配的过程。