vector的erase方法注意点!!!
C++11是这样的:
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
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失效,it成了一个“野指针”。
}
}
正确的使用方式是:
for(vector<int>::iterator it=arr.begin(); it!=arr.end(); ){
if(* it == 0) {
it = arr.erase(it);
}
else {
++it;
}
}
remove or erase区别!!!
STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。
vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的size
vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size