目录
- [使用 erase 返回值继续迭代](#使用 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}