补充进阶内容总览
补充点 | 为什么重要 | 实际应用场景 |
---|---|---|
✅ const 迭代器(const_iterator ) | 只读保护,防止误改 | 遍历 map、set 等结构 |
✅ 反向迭代器(rbegin() / rend() ) | 逆序遍历 | 栈模拟、回文判断 |
✅ 插入迭代器(back_inserter 等) | 支持算法自动插入 | copy() / merge() |
✅ std::advance , std::distance | 操作通用迭代器 | 用在模板函数中 |
✅ STL 算法与迭代器协作 | 算法库依赖迭代器 | sort() , find() , transform() 等 |
✅ 自定义容器适配器 | 实现更灵活的容器 | DIY 链表/环形缓冲区等 |
✅ 迭代器失效(invalidated iterators) | 常见 Bug 根源 | 容器插入、删除元素时 |
✅ C++20 ranges 与 view(现代替代) | 函数式风格遍历处理 | 更简洁表达逻辑,零拷贝 |
二、关键扩展详解
1️⃣ const_iterator
:防止修改
vector<int> v = {1, 2, 3};
vector<int>::const_iterator it = v.begin();
// *it = 5; // ❌ 不允许写
cout << *it; // ✅ 允许读
🧩 使用场景:
-
保证只读遍历
-
函数参数中传入
const vector<T>&
时搭配使用
2️⃣ 反向迭代器:rbegin()
/ rend()
vector<int> v = {1, 2, 3};
for (auto rit = v.rbegin(); rit != v.rend(); ++rit)
cout << *rit << " "; // 输出 3 2 1
3️⃣ 插入迭代器:让算法自动插入
#include <algorithm>
#include <iterator>
vector<int> src = {1, 2, 3};
vector<int> dest;
copy(src.begin(), src.end(), back_inserter(dest));
back_inserter
、front_inserter
、inserter
是三种插入策略。
4️⃣ std::advance
和 std::distance
list<int> lst = {10, 20, 30, 40};
auto it = lst.begin();
advance(it, 2); // it 指向第 3 个元素
cout << *it;
int d = distance(lst.begin(), it); // 结果为 2
在不知道容器类型时(泛型模板中)特别有用。
5️⃣ STL 算法配合迭代器(最实用)
#include <algorithm>
vector<int> v = {1, 5, 3};
auto it = find(v.begin(), v.end(), 5); // 查找元素
sort(v.begin(), v.end()); // 排序
transform(v.begin(), v.end(), v.begin(), [](int x) { return x * 2; });
所有算法都以迭代器范围作为输入,极其强大。
6️⃣ 迭代器失效问题(非常关键)
vector<int> v = {1, 2, 3, 4};
auto it = v.begin();
v.push_back(5); // ❗ 可能导致 it 失效
📌 容器调整大小后,旧的迭代器可能指向非法内存。
安全策略:
-
修改容器后,不要使用之前的迭代器
-
使用
erase()
返回值更新迭代器
7️⃣ C++20 ranges(新范式)
#include <ranges>
#include <iostream>
vector<int> v = {1, 2, 3, 4, 5};
for (int n : v | std::views::filter([](int x){ return x % 2 == 0; }))
cout << n << " "; // 输出:2 4
✅ ranges + views 更现代、更安全、更组合式。
三、哪些是“必须掌握”,哪些是“进阶选学”?
等级 | 推荐掌握内容 |
---|---|
✅ 基础 | begin() , end() , *it , ++it |
✅ 必须 | const_iterator , auto , STL 算法 |
🔄 推荐 | rbegin() , advance() , insert_iterator |
🚀 进阶 | 自定义迭代器类、ranges , distance() 等等 |
⚠️ 必知 | 迭代器失效规则(否则很容易出 bug) |