C++ 迭代器(Iterator)
1.1 定义
- 迭代器是一种检查容器内元素并遍历元素的数据类型。
- 迭代器是一个变量,提供对一个容器中的对象的**(间接)访问方法**,并且定义了容器中对象的范围。。
- 迭代器可以指向容器中的某个元素,通过迭代器就可以对非数组(存储空间不连续)的数据结构进行遍历。
- 容器和string有迭代器类型同时拥有返回迭代器的成员。如:容器有成员 begin 和 end ,其中begin成员复制返回指向第一个元素的迭代器,而end成员返回指向容器尾元素的下一个位置的迭代器,也就是说end指示的是一个不存在的元素,所以end返回的是尾后迭代器。
iterator iter; // 声明迭代器iter
for(iter = 容器.begin(); iter != 容器.end(); iter++){
cout << *iter 或者是 iter->first ;
}
1.2 迭代器种类
- 正向迭代器,定义方法如下:
容器类名::iterator 迭代器名;
- 常量正向迭代器,定义方法如下:
容器类名::const_iterator 迭代器名;
- 反向迭代器,定义方法如下:
容器类名::reverse_iterator 迭代器名;
- 常量反向迭代器,定义方法如下:
容器类名::const_reverse_iterator 迭代器名;
1.3 迭代器的使用
- 通过迭代器可以读取它指向的元素,
*迭代器名
就表示迭代器指向的元素。通过非常量迭代器还能修改其指向的元素。 - 迭代器都可以进行
++
操作。反向迭代器和正向迭代器的区别在于:- 对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素;
begin() -> end() 从前往后遍历
- 对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素。
rbegin() -> rend() 从后往前遍历
- 对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素;
遍历vector容器的所有元素示例:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 0; i < 5; ++i){
v.push_back(i); // v = {0, 1, 2, 3, 4}
}
vector<int>::iterator iter; // 正向迭代 begin -> end,输出 {0, 1, 2, 3, 4}
for(iter = v.begin(); iter != v.end(); ++iter){
cout << *iter << endl;
}
vector<int>::reverse_iterator riter; // 反向迭代 rbegin -> rend,输出 {4, 3, 2, 1, 0}
for(riter = v.rbegin(); riter != v.rend(); ++riter){
cout << *riter << endl;
}
return 0;
}
1.4 迭代器的功能分类
不同容器的迭代器,其功能强弱有所不同。容器的迭代器的功能强弱,决定了该容器是否支持 STL 中的某种算法。
例如,排序算法需要通过随机访问迭代器来访问容器中的元素,因此有的容器就不支持排序算法。
不同容器的迭代器功能:
容器 | 迭代器功能 |
---|---|
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
set / multiset | 双向 |
map / multimap | 双向 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |
不同功能的迭代器说明:
迭代器类别 | 说明 |
---|---|
输入 | 从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算法,同一个输入迭代器不能两次遍历一个序列 |
输出 | 向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算法,同一输出迭代器不能两次遍历一个序列 |
正向 | 组合输入迭代器和输出迭代器的功能,并保留在容器中的位置 |
双向 | 组合正向迭代器和逆向迭代器的功能,支持多遍算法 |
随机访问 | 组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素 |
不同功能的迭代器操作:
- 输入:
++p
,p++
,*p
,p1 = p2
,p1 == p2
,p1 != p2
- 输出:
++p
,p++
,*p
,p1 = p2
- 正向迭代:
++p
,p++
,*p
,p1 = p2
,p1 == p2
,p1 != p2
- 双向迭代:
++p
,p++
,*p
,p1 = p2
,p1 == p2
,p1 != p2
,--p
,p--
- 随机访问:
++p
,p++
,*p
,p1 = p2
,p1 == p2
,p1 != p2
,--p
,p--
,p+=i
,p-=i
,p+i
,p-i
,p1 < 、>、<=、>= p2
,p[i]
(返回 p 后面第 i 个元素的引用),p2-p1
(返回 p2 所指向元素和 p1 所指向元素的序号之差)
1.5 迭代器的辅助函数
STL 中有用于操作迭代器的三个函数模板,它们是:
advance(p, n)
:使迭代器 p 向前或向后移动 n 个元素。distance(p, q)
:计算两个迭代器之间的距离,即迭代器 p 经过多少次 + + 操作后和迭代器 q 相等。如果调用时 p 已经指向 q 的后面,则这个函数会陷入死循环。iter_swap(p, q)
:用于交换两个迭代器 p、q 指向的值。