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

时间:2014-07-06 21:02:45

标签: c++ vector segmentation-fault

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

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

当我运行此代码时,我遇到了分段错误。它有什么问题吗?或者这个代码对你们任何人都有用吗?

3 个答案:

答案 0 :(得分:8)

看起来你想要通常的删除 - 删除习语:

#include <algorithm>
#include <functional>

myvector.erase(std::remove_if(myvector.begin(), myvector.end(),
                              std::mem_fn(&std::string::empty)),
               myvector.end());

答案 1 :(得分:0)

如果你有例如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的解决方案更优雅。

答案 2 :(得分:0)

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