泛型编程旨在让算法独立于存储类型(通过模板实现),算法独立于容器类型(通过迭代器实现)
迭代器
迭代器应该满足至少四个条件:
- 可以对迭代器执行解除引用的操作,以便能够访问它引用的值,如果p是一个迭代器,应对*p进行定义
- 能够互相赋值, p = q
- 能够互相比较, p==q,p!=q
- 能够通过迭代器遍历容器所有元素
迭代器与指针
STL对每个容器类定义了相应的迭代器类型,对于某个类,迭代器可能是指针,也可能是对象;
迭代器是广义指针,指针满足迭代器所有要求,
最好避免直接使用迭代器,尽量使用STL函数,(如for_each())来处理细节,也可以使用C++11新增的基于范围的for循环
for (auto x:score) cout << x << endl;
迭代器类型
输入迭代器
输入迭代器是容器的信息->程序
单向迭代器,可以递增,不能倒退,通过++实现;
输出迭代器
程序的输出,容器的输入,解除引用从而修改容器值,而不能读取
正向迭代器
正向迭代器具备输入迭代器和输出迭代器的功能,同时有自己的功能:总是按相同的顺序遍历一系列值,正向迭代器递增后仍然可以对前面的值解除引用(需要提前保存)
双向迭代器
具有正向迭代器的全部特性,同时支持两种(前缀和后缀)递减运算符
随机访问迭代器
支持随机访问的操作和用于排序的关系运算符
随机访问:
a+n
a-n
a[n]
b-a //b与a之间差多少元素
关系运算符:
a<b a>b a>=b a<=b
指针可以作为迭代器
例如sort函数本来是迭代器作为参数的,但是可以用数组索引(指针)
int SIZE = 100
double arr[SIZE]
sort(arr,arr+SIZE)//数组名+size表示超尾迭代器的位置
iterator头文件
定义了
- ostream_iterator(输出迭代器)
- istream_iterator
- reverse_iterator
- front_iterator
- insert_iterator
其中,reverse_iterator,与rbegin() rend()结合使用,翻转迭代器
insert_iterator,包括front_insert_iterator, back_insert_iterator,插入迭代器可以自动分配内存,确保容器容纳足够信息
vector
迭代器失效
https://blog.csdn.net/skyroben/article/details/70877008