当使用迭代器遍历容器并删除元素时,迭代器可能会失效。
对于vector来说,如果使用普通迭代器(例如std::vector<int>::iterator)进行遍历和删除操作,当你删除一个元素后,后面的元素会向前移动填补空缺,导致当前迭代器指向的位置已经不再有效。此时继续使用该迭代器将产生未定义行为。
对于map来说,使用普通迭代器或者逆向迭代器进行遍历并删除操作同样存在迭代器失效的问题。因为在删除某个键值对后,其他键值对的位置可能发生变化,导致当前迭代器无法正确指向下一个要访问的元素。
解决这个问题的一种常见方式是使用"erase-remove"惯用法。即通过调用容器提供的成员函数 erase() 来移除需要删除的元素,并保持正确的迭代器位置。例如,在vector中可以使用 erase-remove idiom:
vec.erase(std::remove(vec.begin(), vec.end(), value), vec.end());
而在map中可以配合使用返回下一个有效迭代器的 erase() 成员函数:
for (auto it = map.begin(); it != map.end(); )
{
if (condition)
it = map.erase(it);
else
++it;
}
注意:C++11 引入了范围循环 for-each,但不适用于在迭代过程中删除元素的情况,因为它使用的是临时迭代器并不允许修改容器