我的应用程序需要迭代向量并删除某些不满足要求的元素。哪种方法最正确?我相信以下方法是不正确的。原因:我正在分割错误。
std::vector<ObjectX> vec1;
//Fill in vec1
std::vector<ObjectX>::iterator itVec1 = vec1.begin();
for(;itVec1 != vec1.end(); ++itVec1) {
if (Oracle(*itVec1)) vec1.erase(itVec1);
}
答案 0 :(得分:4)
致电时
vec1.erase(itVec1);
您使itVec1
无效。在那之后,++itVec1
是不对的。它导致未定义的行为。您需要稍微更改一下代码。
for( ; itVec1 != vec1.end(); ) {
if (Oracle(*itVec1))
{
itVec1 = vec1.erase(itVec1);
}
else
{
++itVec1;
}
}
您可以使用Erase-Remove Idiom:
删除所有样板代码vec1.erase(std::remove_if(vec1.begin(), vec1.end(), Oracle), vec1.end());
答案 1 :(得分:0)
您可以将正确的项目放入新的矢量中。