C++笔记之迭代器失效问题处理
code review!
参考博文:C++STL迭代器失效的几种情况总结
文章目录
- C++笔记之迭代器失效问题处理
- 一.使用返回新迭代器的插入和删除操作
- 二.对`std::vector` 来说,擦除(erase)元素会导致迭代器失效
一.使用返回新迭代器的插入和删除操作
二.对std::vector
来说,擦除(erase)元素会导致迭代器失效
对于 std::vector
来说,擦除(erase)元素会导致迭代器失效。具体而言,当从 std::vector
中删除元素时,原来指向被删除元素的迭代器就会失效,进而可能引起未定义行为。
处理迭代器失效的方法取决于具体的情况和需求。以下是一些处理迭代器失效的常见方法:
- 使用返回新迭代器的擦除操作:
std::vector
的erase()
函数会返回一个指向下一个有效元素的迭代器。因此,在擦除元素后,可以使用返回的新迭代器继续遍历容器。
#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;
}
- 使用标准算法: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()
函数后,使用返回的新迭代器来继续遍历容器。如果你需要在循环中擦除元素,请特别注意处理迭代器的有效性。