STL-iterator

简介

要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似

定义分类

迭代器按照定义方式分成以下四种。

1. 正向迭代器

1
容器类名::iterator  迭代器名;

2. 常量正向迭代器

1
容器类名::const_iterator  迭代器名;

3. 反向迭代器

1
容器类名::reverse_iterator  迭代器名;

4. 常量反向迭代器

1
容器类名::const_reverse_iterator  迭代器名;

功能分类

1. 正向迭代器

假设 p 是一个前向迭代器,则 p 支持++pp++*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容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升,提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++–-等操作

迭代器模式

供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示(将对聚合对象的遍历封装到一个类中进行)

优点

  1. 它支持以不同的方式遍历一个聚合对象(容器)
  2. 迭代器简化了聚合类
  3. 在同一个聚合上可以有多个遍历
  4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码