在C++11中,从向量中删除元素,同时对其进行迭代

Delete elements from a vector in C++11 while iterating over it

本文关键字:迭代 元素 C++11 向量 删除      更新时间:2023-10-16

我的应用程序需要迭代一个向量,并删除某些不满足要求的元素。哪种方式最正确?我认为以下方式是不正确的。原因:我有分段错误。

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

当您调用时

vec1.erase(itVec1);

您使CCD_ 1无效。之后,++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());

您可以将正确的项放入一个新的向量中。