c++ Vector.erase()导致分段错误

C++ Vector.erase() causing segmentation fault

本文关键字:分段 错误 Vector erase c++      更新时间:2023-10-16

我有一个c++向量,它里面有一些空白元素。我想从向量中删除任何空字符串元素。我试过这个代码:

for (i = 0; i < myvector.size();i++) {
  if (myvector[i] == "") {
    myvector.erase(myvector.begin()+i);
  }
}

当我运行这段代码时,我得到一个分段错误。有什么问题吗?或者这段代码对你们有用吗?

看来您需要使用通常的删除-擦除习惯用法:

#include <algorithm>
#include <functional>
myvector.erase(std::remove_if(myvector.begin(), myvector.end(),
                              std::mem_fn(&std::string::empty)),
               myvector.end());

如果你有例如vec=["A",","B","C"],你删除元素A[1],现在'vec'是长3而不是4,所以vec[3]导致分割错误。

试试这个:

for (vector<...>::iterator i=myvector.begin(); 
              i != myvector.end(); /* do nothing here */) {
   if (i->empty()) {
      i=myvector.erase(i);
   } else {
     ++i;
   }
}

然而,Kerrek的解决方案更优雅。

首先,我为我的英语感到抱歉(我是巴西人,我正在使用谷歌翻译)。但是您的问题不仅仅是关于删除vector之外的项,而是关于访问它的元素。考虑以下情况:我有一个向量v ={1,4,2},我想使用for和迭代器排除所有偶数。当迭代器到达第二个元素(v[2])时,它将排除4,使向量{1,2}。但是在离开for循环之前,迭代器仍然指向第二个元素(v[2]),这是最后一个元素。当它退出时,迭代器将被加1 (i++)并等于v.p end()。因此,即使不给出分割错误,算法也不会去除所有的偶数,如果v ={1,3,4},则会给出分割错误。为了解决这个问题,当你使用v.r ease()时,使用i——(在你的代码中,它不直接使用迭代器,将以相同的方式工作)。或者您可以使用递增条件,就像前面的答案一样,但是需要正确更新迭代器。