vector的Erase相关
vector<int>Vect;
Vect.insert(Vect.begin()+2, 50);
for (auto it=Vect.begin();it!=Vect.end();++it)
{
if (*it==50)
{
Vect.erase(it);
}
}
为什么以上的代码会报错,而下面的一段代码不会报错?
vector<int>Vect;
Vect.insert(Vect.begin()+2, 50);
for (auto it=Vect.begin();it!=Vect.end();++it)
{
if (*it==50)
{
it = Vect.erase(it);
}
}
原因:从容器中删除(erase)一个元素时,被删除元素的迭代器(以及所有后续元素的迭代器)会变成失效状态。这意味着,如果您尝试在 erase 操作后继续使用原迭代器进行循环迭代,您将使用一个已经失效的迭代器。这种行为是未定义的,可能导致运行时错误或程序崩溃。
当执行 Vect.erase(it)
后,it
已经失效,因此无法安全地执行 ++it
进行下一次循环迭代。
代码更改后:
这样处理因为 erase
方法返回一个指向被删除元素下一个元素的迭代器。这意味着,it
立即更新为一个有效的迭代器,指向下一个元素,或在删除末尾元素时指向 Vect.end()
。这样,您就能安全地继续循环,因为确保了每一步都在使用有效的迭代器。
这是处理这类问题的一种常见方法,确保了迭代器在任何时候都是有效的,避免了未定义行为的风险。
修正后的循环正确处理了迭代器的更新,从而避免了在删除元素后继续使用失效迭代器的问题。