遇见的场景
删除vector容器指定元素时;
erase()函数的用法
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素。
具体用法如下:
iterator erase(iterator _Where);
删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素;
iterator erase( iterator _First, iterator _Last);
删除从_First开始到_Last位置的元素,返回值也是一个迭代器,指向最后一个删除元素的下一个位置。
erase()函数的注意点
注意1:调用erase()函数之后,vector后面的元素会向前移位,形成新的容器。这样被删除的元素对应的迭代器,此时会变成一个野指针。
注意2:删除最后一个元素时,it指向vec.end(),然后会对vec.end()之上执行++操作,从而出现段错误(见上一篇博客)。所以需要加入if判断来避免。
即下述代码为错
for(auto it = vec.begin(); it != vec.end(); ++it){
if(*it == target)
vec.erase(it);//此时it变为野指针,而不是指向vec的下一个元素。
}
erase()正确使用方式
for(auto it = vec.begin(); it != vec.end(); ){
if(*it == target)
it = vec.erase(it);//此时it指向被删除元素的下一个位置。
else
it++;
}
或者
for(auto it = vec.begin(); it != vec.end(); ){
if(*it == target)
auto it2 = it;
vec.erase(it2);//此时it指向被删除元素的下一个位置。
else
it++;
}