简介
要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似
定义分类
迭代器按照定义方式分成以下四种。
1. 正向迭代器
1 | 容器类名::iterator 迭代器名; |
2. 常量正向迭代器
1 | 容器类名::const_iterator 迭代器名; |
3. 反向迭代器
1 | 容器类名::reverse_iterator 迭代器名; |
4. 常量反向迭代器
1 | 容器类名::const_reverse_iterator 迭代器名; |
功能分类
1. 正向迭代器
假设 p 是一个前向迭代器,则 p 支持++p
,p++
,*p
操作,还可以被复制或赋值,可以用 ==
和 !=
运算符进行比较。此外,两个正向迭代器可以互相赋值
2. 双向迭代器
双向迭代器具有正向迭代器的全部功能
除此之外,假设 p 是一个双向迭代器,则还可以进行 --p
或者 p--
操作
3. 随机访问迭代器
随机访问迭代器具有双向迭代器的全部功能。除此之外,假设 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
- p += i:使得 p 往后移动 i 个元素
- p -= i:使得 p 往前移动 i 个元素
- p + i:返回 p 后面第 i 个元素的迭代器
- p - i:返回 p 前面第 i 个元素的迭代器
- p[i]:返回 p 后面第 i 个元素的引用
此外,两个随机访问迭代器还可以进行<
,>
,<=
,>=
运算符进行比较
另外,p2 - p1 也是有定义的,其返回值表示 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减一)
下表为STL中不同容器指定使用的迭代器类型:
容器 | 对应的迭代器类型 |
---|---|
array | 随机访问迭代器 |
vector | 随机访问迭代器 |
deque | 随机访问迭代器 |
list | 双向迭代器 |
set / multiset | 双向迭代器 |
map / multimap | 双向迭代器 |
forward_list | 正向迭代器 |
unordered_map / unordered_multimap | 正向迭代器 |
unordered_set / unordered_multiset | 正向迭代器 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |
容器适配器stack 和 queue没有迭代器,但它们有一些成员函数,可以对元素进行访问
迭代器与指针的差别
迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->
、*
、++
、–-
等。迭代器封装了指针,是一个“可遍历STL容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升,提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++
,–-
等操作
迭代器模式
供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示(将对聚合对象的遍历封装到一个类中进行)
优点
- 它支持以不同的方式遍历一个聚合对象(容器)
- 迭代器简化了聚合类
- 在同一个聚合上可以有多个遍历
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码