1. 迭代器Iterator
- 用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
- 一般仅用于底层聚合支持类,如STL的list、vector、stack等容器类及ostream_iterator等扩展iterator。
- 每种数据数据容器都可以定义自己的迭代器类型。
- 使用迭代器可以读取容器中的每一个元素。
- const_iterator 迭代器只能读取容器中的元素,但是不能修改。
- 双向容器例如vector的迭代器不能使用“<”,">"这样的比较运算符,只能用“!=”或者“==”。
- 注意vector<int>::const_iterator 和 const vector<int>::iterator的区别。
- 迭代器除了可以进行“++”,“--”操作,还可以进行“+n”,"-n"操作
-
vector ivec(10,1);//定义一个十行一列的向量 vector ::iterator iter;//指定一个迭代器 //使用迭代器访问数据元素 for(vector ::iterator iter=ivec.begin();iter!=ivec.end();++iter) { *iter = 5;//使用*访问迭代器所指的元素 } //using const_iterator,只能读取元素不能修改 for(vector ::const_iterator citer=ivec.begin();citer!=ivec.end();citer++) { std::cout<<*citer; //correct,可以访问所指元素 *citer = 3;// error, 不能修改所指元素 } const vector ::iterator m_iter = ivec.begin(); *m_iter = 7;//correct,可以修改所指容修改所指容器的元素 m_iter++;//error, 迭代器本身不能被修改
2. 迭代器的分类
根据STL中的分类,iterator包括:
Input Iterator:只能单步向前迭代元素,不允许修改由该类迭代器引用的元素。
Output Iterator:该类迭代器和Input Iterator极其相似,也只能单步向前迭代元素,不同的是该类迭代器对元素只有写的权力。
Forward Iterator:该类迭代器可以在一个正确的区间中进行读写操作,它拥有Input Iterator的所有特性,和Output Iterator的部分特性,以及单步向前迭代元素的能力。
Bidirectional Iterator:该类迭代器是在Forward Iterator的基础上提供了单步向后迭代元素的能力。
Random Access Iterator:该类迭代器能完成上面所有迭代器的工作,它自己独有的特性就是可以像指针那样进行算术计算,而不是仅仅只有单步向前或向后迭代。
以上五类迭代器的从属关系如下:
其中箭头A→B表示,A是B的强化类型,这也说明了如果一个算法要求B,那么A也可以应用于其中。
图1. 五种迭代器之间的关系
- vector 和deque提供的是RandomAccessIterator.
- list提供的是BidirectionalIterator.
- set和map提供的 iterators是 ForwardIterator.
- 说明:每种迭代器均可进行包括表中前一种迭代器可进行的操作。
迭代器操作 说明
(1)所有迭代器
p++ 后置自增迭代器
++p 前置自增迭代器
(2)输入迭代器
*p 复引用迭代器,作为右值
p=p1 将一个迭代器赋给另一个迭代器
p==p1 比较迭代器的相等性
p!=p1 比较迭代器的不等性
(3)输出迭代器
*p 复引用迭代器,作为左值
p=p1 将一个迭代器赋给另一个迭代器
(4)正向迭代器
提供输入输出迭代器的所有功能
(5)双向迭代器
--p 前置自减迭代器
p-- 后置自减迭代器
(6)随机迭代器
p+=i 将迭代器递增i位
p-=i 将迭代器递减i位
p+i 在p位加i位后的迭代器
p-i 在p位减i位后的迭代器
p[i] 返回p位元素偏离i位的元素引用
p<p1 如果迭代器p的位置在p1前,返回true,否则返回false
p<=p1 p的位置在p1的前面或同一位置时返回true,否则返回false
p>p1 如果迭代器p的位置在p1后,返回true,否则返回false
p>=p1 p的位置在p1的后面或同一位置时返回true,否则返回false
只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:
容器 支持的迭代器类别 容器 支持的迭代器类别 容器 支持的迭代器类别
vector 随机访问 deque 随机访问 list 双向
set 双向 multiset 双向 map 双向
multimap 双向 stack 不支持 queue 不支持
priority_queue 不支持