当前位置: 首页 > news >正文

C++笔记之迭代器失效问题处理

C++笔记之迭代器失效问题处理

code review!
在这里插入图片描述
参考博文:C++STL迭代器失效的几种情况总结

文章目录

  • C++笔记之迭代器失效问题处理
    • 一.使用返回新迭代器的插入和删除操作
    • 二.对`std::vector` 来说,擦除(erase)元素会导致迭代器失效

一.使用返回新迭代器的插入和删除操作

在这里插入图片描述

二.对std::vector 来说,擦除(erase)元素会导致迭代器失效

对于 std::vector 来说,擦除(erase)元素会导致迭代器失效。具体而言,当从 std::vector 中删除元素时,原来指向被删除元素的迭代器就会失效,进而可能引起未定义行为。
在这里插入图片描述

处理迭代器失效的方法取决于具体的情况和需求。以下是一些处理迭代器失效的常见方法:

  1. 使用返回新迭代器的擦除操作std::vectorerase() 函数会返回一个指向下一个有效元素的迭代器。因此,在擦除元素后,可以使用返回的新迭代器继续遍历容器。
#include <iostream>
#include <vector>int main() {std::vector<int> myVector = {1, 2, 3, 4, 5};for (auto it = myVector.begin(); it != myVector.end(); ) {if (*it % 2 == 0) {it = myVector.erase(it); // 擦除元素,并返回指向下一个元素的新迭代器} else {++it; // 移动迭代器到下一个位置}}// 使用新迭代器遍历容器for (auto it = myVector.begin(); it != myVector.end(); ++it) {std::cout << *it << " ";}return 0;
}
  1. 使用标准算法:C++ 提供了一些标准算法,如 std::remove_if,用于在不失效迭代器的情况下移除满足条件的元素。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> myVector = {1, 2, 3, 4, 5};myVector.erase(std::remove_if(myVector.begin(), myVector.end(), [](int n) {return n % 2 == 0;}), myVector.end());// 使用迭代器遍历容器for (auto it = myVector.begin(); it != myVector.end(); ++it) {std::cout << *it << " ";}return 0;
}

在此例中,我们使用 std::remove_if 来将满足条件的元素移到容器末尾,并返回一个指向新的逻辑尾部的迭代器,然后再使用 erase() 擦除这些元素。

总之,在删除 std::vector 的元素时,尽量使用返回新迭代器的擦除操作或者标准算法,以确保迭代器不会失效。在使用 erase() 函数后,使用返回的新迭代器来继续遍历容器。如果你需要在循环中擦除元素,请特别注意处理迭代器的有效性。

http://www.lryc.cn/news/101453.html

相关文章:

  • Tomcat的startup.bat文件出现闪退问题
  • JAVA8-lambda表达式8:在设计模式-模板方法中的应用
  • React之组件间通信
  • 【MATLAB第58期】基于MATLAB的PCA-Kmeans、PCA-LVQ与BP神经网络分类预测模型对比
  • CF1833 A-E
  • 【深度学习】【Image Inpainting】Generative Image Inpainting with Contextual Attention
  • 二维深度卷积网络模型下的轴承故障诊断
  • redis突然变慢问题定位
  • React井字棋游戏官方示例
  • 七大经典比较排序算法
  • 【点云处理教程】03使用 Python 实现地面检测
  • Python 日志记录:6大日志记录库的比较
  • 最近遇到一些问题的解决方案
  • 封装hutool工具生成JWT token
  • 【手机】三星手机刷机解决SecSetupWizard已停止
  • GDAL C++ API 学习之路 OGRGeometry 抽象曲线基类 OGRCurve
  • etcd底层支持的数据库有哪些
  • linux设备驱动的poll与fasync
  • TortoiseGit安装与配置
  • Java代码打印空心菱形(小练习)
  • 【性能优化】MySQL百万数据深度分页优化思路分析
  • 交叉编译工具链的安装、配置、使用
  • 【C++ 进阶】继承
  • Git使用详细教程
  • 小程序 表单验证
  • 本地仓库推送至远程仓库
  • 【Unity2D】角色动画的切换
  • 【MATLAB第62期】基于MATLAB的PSO-NN、BBO-NN、前馈神经网络NN回归预测对比
  • 深度剖析C++ 异常机制
  • adb no permissions (user *** is not in the plugdev group)