在C++标准库中,迭代器是访问容器元素的核心机制,不同的容器支持不同类型的迭代器,而迭代器的分类决定了我们可以使用哪些操作来遍历和操作容器元素。C++的迭代器按功能从弱到强主要分为四种:前向迭代器、双向迭代器、随机访问迭代器和输入/输出迭代器,其中前四种是日常遍历容器时最常用到的类型。

一、前向迭代器(forward_iterator)
前向迭代器是最基础的迭代器类型之一,它支持单向遍历,只能从容器起始位置向后移动到末尾位置,不能反向移动,也支持多次遍历同一个容器。这类迭代器通常对应单向链表等容器,比如std::forward_list。
前向迭代器支持的核心操作包括:解引用获取元素、前置/后置自增移动到下一个元素、比较是否相等。下面是一个使用前向迭代器遍历std::forward_list的示例:
#include <iostream>
#include <forward_list>
int main() {
// 创建单向链表并初始化元素
std::forward_list<int> flist = {1, 2, 3, 4, 5};
// 获取前向迭代器,从起始位置开始遍历
std::forward_list<int>::iterator it;
for (it = flist.begin(); it != flist.end(); ++it) {
std::cout << *it << " "; // 解引用迭代器获取元素值
}
// 输出结果:1 2 3 4 5
return 0;
}
二、双向迭代器(bidirectional_iterator)
双向迭代器在前向迭代器的基础上增加了反向移动的能力,既可以向后遍历,也可以向前遍历,但是仍然不支持随机访问(比如直接跳转到第n个元素)。常见的支持双向迭代器的容器有std::list、std::set、std::map等。
除了前向迭代器的所有操作外,双向迭代器还支持前置/后置自减操作,用于移动到前一个元素。下面是使用双向迭代器遍历std::list的示例,同时演示正向和反向遍历:
#include <iostream>
#include <list>
int main() {
std::list<int> l = {10, 20, 30, 40};
// 正向遍历
std::cout << "正向遍历结果:";
std::list<int>::iterator it;
for (it = l.begin(); it != l.end(); ++it) {
std::cout << *it << " ";
}
// 反向遍历
std::cout << "n反向遍历结果:";
std::list<int>::reverse_iterator rit;
for (rit = l.rbegin(); rit != l.rend(); ++rit) {
std::cout << *rit << " ";
}
// 输出结果:正向遍历结果:10 20 30 40
// 反向遍历结果:40 30 20 10
return 0;
}
三、随机访问迭代器(random_access_iterator)
随机访问迭代器是功能最强的迭代器类型,它支持双向移动,还支持随机访问操作,比如可以直接通过迭代器加上偏移量跳转到任意位置,也支持迭代器之间的减法运算得到两个元素的距离。支持这类迭代器的容器有std::vector、std::deque、原生数组等。
随机访问迭代器除了双向迭代器的所有操作外,还支持it + n、it - n、it1 - it2、it[n]、比较大小等操作。下面是使用随机访问迭代器遍历std::vector的示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {5, 15, 25, 35, 45};
// 普通正向遍历
std::cout << "普通遍历:";
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
// 随机访问遍历,直接跳转到指定位置
std::cout << "n随机访问第3个元素:" << vec.begin()[2] << std::endl;
std::cout << "两个迭代器的距离:" << vec.end() - vec.begin() << std::endl;
// 输出结果:普通遍历:5 15 25 35 45
// 随机访问第3个元素:25
// 两个迭代器的距离:5
return 0;
}
四、输入/输出迭代器(input_iterator/output_iterator)
输入迭代器和输出迭代器是更特殊的迭代器类型,主要用于输入输出场景,比如从流中读取数据或者向流中写入数据。输入迭代器只能单次遍历,每次解引用只能读取一次元素,之后迭代器就会失效;输出迭代器只能单次写入,每次解引用只能写入一次元素。
最常见的输入迭代器是std::istream_iterator,输出迭代器是std::ostream_iterator,下面是使用这两种迭代器从标准输入读取数据并输出到标准输出的示例:
#include <iostream>
#include <iterator>
#include <vector>
int main() {
// 输入迭代器,从标准输入读取int类型数据到vector
std::cout << "请输入多个整数,以空格分隔,按回车结束:" << std::endl;
std::istream_iterator<int> in_it(std::cin);
std::istream_iterator<int> end_it;
std::vector<int> input_vec(in_it, end_it);
// 输出迭代器,将vector中的元素输出到标准输出
std::cout << "你输入的元素是:";
std::ostream_iterator<int> out_it(std::cout, " ");
std::copy(input_vec.begin(), input_vec.end(), out_it);
return 0;
}
四种迭代器的特性对比
为了更清晰地区分四种迭代器的差异,我们可以通过下表对比它们的核心特性:
| 迭代器类型 | 支持的操作 | 适用容器示例 |
|---|---|---|
| 前向迭代器 | 单向移动、解引用、相等比较 | std::forward_list |
| 双向迭代器 | 前向迭代器所有操作 + 双向移动 | std::list、std::set、std::map |
| 随机访问迭代器 | 双向迭代器所有操作 + 随机跳转、大小比较、距离计算 | std::vector、std::deque、原生数组 |
| 输入/输出迭代器 | 单次读取/写入、单向移动 | std::istream_iterator、std::ostream_iterator |
遍历容器的最佳实践
在实际开发中,除了直接使用迭代器遍历容器,C++11之后还引入了范围for循环,它本质上也是基于迭代器实现的,代码更简洁。比如遍历std::vector可以写成:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4};
// 范围for循环遍历,底层自动使用迭代器实现
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
需要注意的是,范围for循环在遍历过程中如果修改了容器的结构(比如增加或删除元素),会导致迭代器失效,引发未定义行为,这时候就需要手动控制迭代器的移动逻辑,避免出现问题。
C++迭代器容器遍历forward_iteratorbidirectional_iterator修改时间:2026-07-16 14:51:40