C++ STL迭代器的用法(附带实例)
在 C++ 中,访问容器中的元素需要通过迭代器。迭代器可以指向容器中的某个元素,进而读写该元素的值。从这一点上看,迭代器和指针非常类似。
迭代器分为如下 5 种:
不同容器对应的迭代器类型如下表所示:
迭代器的定义格式有 4 种,具体如下表所示。定义迭代器后,就可以通过“*迭代器名”读取迭代器指向的元素。
其中,非常量迭代器可以修改指向的元素;正向迭代器进行自增(++)操作时,指向容器中的后一个元素;反向迭代器进行自增(++)操作时,指向容器中的前一个元素。
下面以 vector 容器为例,介绍迭代器的用法和功能。vector 支持随机访问迭代器,因此遍历 vector 容器有多种方法。下面的代码中,每个循环都演示了一种方法。
迭代器分为如下 5 种:
- 输入迭代器:又称为只读迭代器,它从容器中读取元素,一次只能读入一个元素并向前移动。只支持一遍算法,即同一个输入迭代器不能遍历一个序列两次。
- 输出迭代器:又称为只写迭代器,它往容器中写入元素,一次只能写入一个元素并向前移动。同一个输出迭代器不能遍历一个序列两次。
- 正向迭代器:组合了输入迭代器和输出迭代器的功能,且可以多次解析一个迭代器指定位置,可以对一个值进行多次读/写。
- 双向迭代器:组合了正向迭代器的功能,且可通过操作符向后移动位置。
- 随机访问迭代器:组合了双向迭代器的功能,可以向前、向后跳过任意个位置,且可以直接访问容器中任意位置的元素。
不同容器对应的迭代器类型如下表所示:
容器 | 对应的迭代器类型 | 容器 | 对应的迭代器类型 |
---|---|---|---|
vector | 随机访问迭代器 | forward_list | 正向迭代器 |
deque | 随机访问迭代器 | unordered_map / unordered_multimap | 正向迭代器 |
list | 双向迭代器 | unordered_set / unordered_multiset | 正向迭代器 |
set/multiset | 双向迭代器 | stack | 不支持迭代器 |
map/multimap | 双向迭代器 | queue | 不支持迭代器 |
迭代器的定义格式有 4 种,具体如下表所示。定义迭代器后,就可以通过“*迭代器名”读取迭代器指向的元素。
迭代器类型 | 定义格式 |
---|---|
正向迭代器 | 容器类名::iterator 迭代器名; |
反向迭代器 | 容器类名::reverse_iterator 迭代器名; |
常量正向迭代器 | 容器类名::const_iterator 迭代器名; |
常量反向迭代器 | 容器类名::const_reverse_iterator 迭代器名; |
其中,非常量迭代器可以修改指向的元素;正向迭代器进行自增(++)操作时,指向容器中的后一个元素;反向迭代器进行自增(++)操作时,指向容器中的前一个元素。
下面以 vector 容器为例,介绍迭代器的用法和功能。vector 支持随机访问迭代器,因此遍历 vector 容器有多种方法。下面的代码中,每个循环都演示了一种方法。
#include <iostream> #include <vector> //引入 vector 头文件 using namespace std; int main() { vector<int> v; //定义一个数组 int array[10] = {1,2,3,4,5,6,7,8,9,10}; //定义一个数组 v = vector<int>(array,array+10); //使用数组初始化 vector cout << "1: " << endl; //第 1 种遍历方法 for (int i = 0; i < v.size(); ++i) //size 返回元素个数 cout << v[i] << " "; //像普通数组一样使用 vector 容器 cout << endl << "2: " << endl; //第 2 种遍历方法 vector<int>::iterator i; //用 != 比较两个迭代器 for (i = v.begin(); i != v.end(); ++i) cout << *i << " "; cout << endl << "3: " << endl; //第 3 种遍历方法 for (i = v.begin(); i < v.end(); ++i) //用 < 比较两个迭代器 cout << *i << " "; cout << endl << "4: " << endl; //第 4 种遍历方法 i = v.begin(); //隔位输出 while (i < v.end()){ cout << *i << " "; i += 2; //随机访问迭代器支持 "+=" 整数的操作 } }程序运行结果为:
1: 1 2 3 4 5 6 7 8 9 10 2: 1 2 3 4 5 6 7 8 9 10 3: 1 2 3 4 5 6 7 8 9 10 4: 1 3 5 7 9