在使用erase()删除元素时,如果不清楚该函数实现原理,可能会造成莫名的bug,
正常情况下使用for循环查找vector中元素是否满足条件时一般会用错误演示中的代码,但这种情况可能会导致段错误,原因在于,如果it当前为最后一个元素的迭代器,那么将会返回无效地址,此时将执行it++;正是这条语句导致的地址非法即段错误,因此要解决该问题,那么就需要将it回退到n-1处的地址,或者修改for循环,目的就是防止访问无效地址。
int a[3] = {1,2,3};
vector<int> v(a,a+3);
//错误演示
for(vector<int>::iterator it =v.begin();v != v.end();it++)
{
if(*it ==2)
{
it = v.erase(it);//表示将当前迭代器的下一个迭代器赋给it,否则it将为野指针
}
}
//方案一
if(*it ==2)
{
it = v.erase(it);//表示将当前迭代器的下一个迭代器赋给it,否则it将为野指针
it--;
}
//方案二
for(vector<int>::iterator it =v.begin();v != v.end();)
{
if(*it ==2)
{
it = v.erase(it);//表示将当前迭代器的下一个迭代器赋给it,否则it将为野指针
}
else
it++;
}