STL 迭代器
一、迭代器分类
1.输入迭代器(只能从序列容器中读取数据,不能向其中写入数据)
- 如输入流迭代器:istream_iterator<T>
2.输出迭代器(只能向序列容器中写入数据,不能从其中读取数据,不要求定义==和!=)
- 如输出流迭代器ostream_iterator<T> out(输出流对象,字符串),向输出流中写入数据时,将字符串插入到各个数据之间
3.前向迭代器
- 既是输入迭代器,同时又是输出迭代器,同时支持数据读取和写入。并且可以对序列进行单方向遍历;可以保存一个前向迭代器,并利用它从同一个位置重新遍历,一次支持多遍扫描算法。
- replace算法(必须满足前向迭代器的条件):replace(first_iterator , last_iterator , const T& x , const T &y),将容器[first,last)区间内素有等于x的值用y替代,时间复杂度为O(N),但first_iterator和last_iterator必须满足前向迭代器的条件
- 数组、链表list、双端队列deque均满足双端队列的条件;
4.双向迭代器
- 具有单向迭代器所有功能&&可以在两个方向遍历数据(支持序列反向遍历)
- 必须定义前缀和后缀++ 和--操作,时间复杂度均为常量;
- reverse算法(必须满足双向迭代器的条件):reverse(start,end),翻转[start,end)区间内所有元素;
- 链表list(双链表)满足双向迭代器的条件。
5.随机访问迭代器
- 支持双向迭代器所有功能&&整数的加法和减法操作,r+n,r-n,n+r等&&使用表达式r[n]访问容器中第n个元素&&双向“跳转”,以r+=n和r-=n表示;迭代器减法,以r-s表示;比较,以r<s,r>s,r<=s,r>=s表示,结果为bool;
注:r和s均为随机访问迭代器;n为整数;
6.STL迭代器的层次结构:算法和容器之间的高效结合
- 输入/输出迭代器—>前向迭代器—>双向迭代器—>随机访问迭代器
- list是双向迭代器;
- find算法要求输入迭代器
- sort算法要求随机访问迭代器
- deque提供了随机访问迭代器
- set提供了双向迭代器
- merge算法要求输入迭代器或更高级的迭代器
7.插入迭代器(将类属算法转入到“插入模式”)
- back_insert_iterator<Container>:使用Container的push_back成员函数,适用于vector,list,deque等类型的容器(它们都提供了push_back成员函数);
- front_insert_iterator<Container>:使用Container的push_front成员函数,有线性复杂度,vector无法提供push_front成员函数,因此该迭代器不适用于vector;
- insert_iterator<Container>:使用Container的insert成员函数,最为普通的插入迭代器,允许在容器任意位置插入数据;可用于任何类型的容器(因为任何容器均提供了insert(iterator,value)成员函数)
- 注:这种插入操作使容器扩展已分配内存空间,赋值操作要求必须实现存在已分配内存保存结果。
对应函数:
- back_inserter(Container c):同back_insert_iterator<Container>(Container c)
- front_inserter(Container c):同front_insert_iterator<Container>(Container c)
- inserter(Container c):对应于insert_iterator<Container>(Container c)