1、迭代器的作用
- 可遍历STL容器内全部或部分元素的对象
- 指出容器中的一个特定位置
- 所有容器都提供两种迭代器:container::iterator以“读/写”模式遍历元素, container::const_iterator以“只读”模式遍历元素
- 迭代器示例:iterator
- 能够让迭代器与算法不干扰的相互发展,最后又能够无间隙的粘合起来。
- 重载了*,++,==,!=,=运算符,用以操作复杂的数据结构
- 容器提供迭代器,算法使用迭代器
2、迭代器的基本操作
操作 | 效果 |
* | 返回当前位置上的元素值。如果该元素有成员,可以通过迭代器以operator ->取用 |
++ | 将迭代器前进至下一元素 |
==和!= | 判断两个迭代器是否指向同一位置 |
= | 为迭代器赋值(将所指元素的位置赋值过去) |
3、迭代器的分类
- 不同容器提供自己的迭代器,所以不同迭代器具有不同的能力
- 不同的算法根据需要不同的迭代器的能力,相同的算法需要根据迭代器的能力不同而做相应的优化
(1)双向迭代器
- 可以双向行进,以递增运算前进或以递减运算后退。
- list、set和map提供双向迭代器
(2)随机存取迭代器
- 除了具备双向迭代器的所有属性,还具备随机访问能力
- 可以对迭代器增加或减少一个偏移量、处理迭代器之间的距离或者使用<和>之类的关系运算符比较两个迭代器。
Vector<int> v;
for(pos=v.begin();pos<v.end();++pos{
…
}
- vector、deque和string提供随机存取迭代器
举例:
#include <iostream>
#include <list>
#include <vector>
#include <set>
using namespace std;
template<class InputIterator, class Distance>
void advence_II(InputIterator &i, Distance n)
{
for (; n > 0; --n;++i); //单向,逐一前进
}
template<class BidirectionslIterator, class Distance>
void advence_II(BidirectionslIterator &i, Distance n)
{
if (n >= 0) //双向,逐一前进
for (; n>0; --n, ++i);
else
for (; n<0; ++n, --i);
}
template<class RandomAccessIterator, class Distance>
void advence_II(RandomAccessIterator &i, Distance n)
{
i += n; //随机,跳跃前进
}
void main()
{
system("pause");
}
3、迭代器的相关类型
- 有些算法内部需要用到迭代器所代表元素的类型,这个就是迭代器的相关类型
- 迭代器的traits编程技法
- 用来扩充容器与算法