【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录

我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。

但一些场景中,我们又需要在执行删除操作,并继续遍历迭代器,那么可以通过以下的方式进行规避。

使用 erase 返回值继续迭代

erase 执行后,会返回下一个元素的新迭代器。

cpp 复制代码
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end();) {
    if (*it == 2) {  // 删除元素 2
        it = vec.erase(it);  // 返回 3 所在的新迭代器
    } else {
        ++it;  // 未删除时正常递增
    }
}
// 最终结果:vec = {1, 3, 4, 5}

使用索引进行遍历

cpp 复制代码
std::vector<int> vec = {1, 2, 3, 4, 5};
for (size_t i = 0; i < vec.size();) {
    if (vec[i] == 2) {
        vec.erase(vec.begin() + i);
    } else {
        ++i;
    }
}
// 最终结果:vec = {1, 3, 4, 5}
相关推荐
晴天的雨.9921 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂1 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven1 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981031 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus12 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla13 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu19 小时前
一个通用游戏数据服务器
c++·架构
another heaven19 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP21 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck1 天前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型