目录
1. 正向迭代器(Forward Iterator)
1.1 基本概念
正向迭代器是STL中最基础的迭代器类型,用于从容器的开始到结束顺序遍历元素。所有标准容器(如vector
、string
、list
等)都至少支持正向迭代器。
1.2 核心特性
-
遍历方向:从
begin()
到end()
(从左到右) -
支持的操作:
-
*it
(解引用) -
->
(成员访问) -
++it
/it++
(向后移动) -
==
/!=
(比较)
-
-
类别:属于前向迭代器(Forward Iterator)或更强的迭代器类型
1.3 典型使用
std::vector<int> v = {1, 2, 3, 4};
// 使用正向迭代器遍历
for (auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " "; // 输出: 1 2 3 4
}
1.4 重要特点
-
end()
指向的是最后一个元素的下一个位置(尾后迭代器) -
区间表示法为左闭右开
[begin, end)
-
所有标准算法(如
std::sort
、std::find
)都基于这种迭代器设计
2. 反向迭代器(Reverse Iterator)
2.1 基本概念
反向迭代器是正向迭代器的适配器,用于从容器的末尾向开头逆向遍历元素。它是通过封装正向迭代器实现的。
2.2 核心特性
-
遍历方向:从
rbegin()
到rend()
(从右到左) -
支持的操作:
-
*rit
(解引用) -
->
(成员访问) -
++rit
/rit++
(向前移动) -
==
/!=
(比较)
-
-
底层实现:基于正向迭代器,但逻辑反转
2.3 典型使用
std::vector<int> v = {1, 2, 3, 4};
// 使用反向迭代器遍历
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {
std::cout << *rit << " "; // 输出: 4 3 2 1
}
2.4 重要特点
-
rbegin()
指向最后一个元素 -
rend()
指向第一个元素的前一个位置 -
区间表示法仍为左闭右开
[rbegin, rend)
-
++rit
实际上是让内部的正向迭代器--
3. 正反迭代器对比
特性 | 正向迭代器 | 反向迭代器 |
---|---|---|
起始位置 | begin() (首元素) | rbegin() (末元素) |
结束位置 | end() (尾后) | rend() (首前) |
遍历方向 | 从前向后 | 从后向前 |
operator++ | 向后移动 | 向前移动 |
解引用值 | 当前元素 | 当前元素 |
底层实现 | 直接迭代 | 正向迭代器的适配器 |
区间表示 | [begin, end) | [rbegin, rend) |
4. 正反迭代器转换
4.1 base() 方法
反向迭代器提供了base()
方法,可以获取对应的正向迭代器:
std::vector<int> v = {1, 2, 3, 4};
auto rit = v.rbegin(); // 指向4
auto it = rit.base(); // 指向end()(即4的后面)
重要关系:
-
rit
与rit.base()
的物理位置相邻 -
*rit == *(rit.base() - 1)
4.2 转换示例
// 在反向迭代器位置插入元素
std::vector<int> v = {1, 2, 3, 4};
auto rit = std::find(v.rbegin(), v.rend(), 2); // 找到2的反向迭代器
v.insert(rit.base(), 99); // 在2后面插入99
// v变为 {1, 2, 99, 3, 4}
5. 迭代器失效问题
5.1 共同规则
-
插入/删除元素可能导致所有迭代器失效
-
扩容操作(如
vector
的push_back
)会使所有迭代器失效
5.2 特殊注意事项
-
反向迭代器的失效规则与其对应的正向迭代器一致
-
在修改容器后,必须重新获取迭代器