按条件删除最容易想到的方法是用迭代器遍历向量,满足条件者删除之。
然而用erase处理过的迭代器会失效。
在C++11中erase的返回值是下一个迭代器,因此可以这样用:
itr=vec.erase(itr);
最好的解决办法是不用迭代器。用algorithm里的remove或者remove_if方法。这两个方法会把向量中所有满足条件的元素删除。
这里要注意的是,删除操作截短了向量,在原向量的尾部,也就是新向量尾部之后,会有一段垃圾段落。需要用erase的一个重载:
erase(itr1,itr2)删除掉。这次看起来多余的erase的调用是因为remove仅仅是将新向量的尾部作为返回值返回,而没有直接更改向量长度导致的。
例子:
vec.erase(remove_if(vec.begin(),vec.end(),[](Param param){
return (/*TODO:*/)?true;false;
}),vec.end());