企业品牌类网站,网站建设相关技术方案,智能展厅,服装购物网站的建设与技术论文C笔记之迭代器失效问题处理
code review! 参考博文#xff1a;CSTL迭代器失效的几种情况总结 文章目录 C笔记之迭代器失效问题处理一.使用返回新迭代器的插入和删除操作二.对std::vector 来说#xff0c;擦除#xff08;erase#xff09;元素会导致迭代器失效 一.使用返回…C笔记之迭代器失效问题处理
code review! 参考博文CSTL迭代器失效的几种情况总结 文章目录 C笔记之迭代器失效问题处理一.使用返回新迭代器的插入和删除操作二.对std::vector 来说擦除erase元素会导致迭代器失效 一.使用返回新迭代器的插入和删除操作 二.对std::vector 来说擦除erase元素会导致迭代器失效
对于 std::vector 来说擦除erase元素会导致迭代器失效。具体而言当从 std::vector 中删除元素时原来指向被删除元素的迭代器就会失效进而可能引起未定义行为。
处理迭代器失效的方法取决于具体的情况和需求。以下是一些处理迭代器失效的常见方法
使用返回新迭代器的擦除操作std::vector 的 erase() 函数会返回一个指向下一个有效元素的迭代器。因此在擦除元素后可以使用返回的新迭代器继续遍历容器。
#include iostream
#include vectorint main() {std::vectorint 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;
}使用标准算法C 提供了一些标准算法如 std::remove_if用于在不失效迭代器的情况下移除满足条件的元素。
#include iostream
#include vector
#include algorithmint main() {std::vectorint 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() 函数后使用返回的新迭代器来继续遍历容器。如果你需要在循环中擦除元素请特别注意处理迭代器的有效性。