vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
iterator erase( iterator _Where);
删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素;
iterator erase( iterator _First, iterator _Last);
删除从_First开始到_Lsat位置的元素,返回值也是一个迭代器,指向最后一个删除元素的下一个位置。
调用erase()函数后,vector后面的元素会向前移位,形成新的容器,这样原来指向删除元素的迭代器(_Where)就失效了。
所以下面的程序是错误的!
for(vector<int>::iterator it=arr.begin(); it!=arr.end(); it ++) {
if(* it == 0) {
arr.erase(it); //在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”。
}
}
正确的使用方式是:
for(vector<int>::iterator it=arr.begin(); it!=arr.end(); ){
if(* it == 0) {
it = arr.erase(it);
}
else {
++it;
}
}