C++ 中有 5 种主要的迭代器类型,它们形成一个层次结构,每种都有不同的功能和限制。
C++ 迭代器的 5 种类型
1. 输入迭代器 (Input Iterator)
- 只读,单向,一次性
- 只能
++it,不能--it - 只能读取
*it,不能修改 - 典型例子:
std::istream_iterator
1 | std::istream_iterator<int> it(std::cin); |
2. 输出迭代器 (Output Iterator)
- 只写,单向,一次性
- 只能
++it,不能读取 - 典型例子:
std::ostream_iterator
1 | std::ostream_iterator<int> it(std::cout, " "); |
3. 前向迭代器 (Forward Iterator) ⭐
- 读写,单向,可多次遍历
- 支持
++it,不支持--it - 可以多次读写同一位置
- 典型例子:
std::forward_list<T>::iterator
1 | std::forward_list<int> flist = {1, 2, 3, 4}; |
4. 双向迭代器 (Bidirectional Iterator)
- 读写,双向,可多次遍历
- 支持
++it和--it - 典型例子:
std::list<T>::iterator,std::set<T>::iterator
1 | std::list<int> lst = {1, 2, 3, 4}; |
5. 随机访问迭代器 (Random Access Iterator)
- 读写,随机访问,支持算术运算
- 支持
it + n,it - n,it[n],it1 - it2 - 典型例子:
std::vector<T>::iterator,std::array<T>::iterator
1 | std::vector<int> vec = {1, 2, 3, 4, 5}; |
前向迭代器详解
什么是前向迭代器?
前向迭代器是最基础的”真正有用”的迭代器,它具备:
- 可读写:
*it既可以读取也可以修改 - 单向移动:只支持
++it,不支持--it - 多次遍历:可以保存迭代器副本,重复访问同一元素
- 相等比较:支持
==和!=
前向迭代器的要求
1 | template<typename ForwardIt> |
典型容器和迭代器类型
1 | // 前向迭代器 |
迭代器层次结构
1 | 输入迭代器 ←─┐ |
每个层次都包含下层的所有功能:
- 随机访问迭代器可以用作双向迭代器
- 双向迭代器可以用作前向迭代器
- 等等…
实际应用
算法对迭代器类型的要求
1 | // 不同算法需要不同类型的迭代器 |
前向迭代器是单链表等数据结构的自然选择,提供了基本的遍历和修改能力,但不支持高效的反向遍历或随机访问。