在迭代它时从C ++ 11中的向量中删除元素

时间:2016-03-31 23:09:31

标签: c++ c++11

我的应用程序需要迭代向量并删除某些不满足要求的元素。哪种方法最正确?我相信以下方法是不正确的。原因:我正在分割错误。

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);
}

2 个答案:

答案 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)

您可以将正确的项目放入新的矢量中。