《C++ Primer 第五版》迭代器补充 讲解

补充进阶内容总览

补充点为什么重要实际应用场景
✅ 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_inserterfront_inserterinserter 是三种插入策略。


4️⃣ std::advancestd::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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dlz0836

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值