繁体   English   中英

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

[英]C++ Vector.erase() causing segmentation fault

我有一个 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' 是 long 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 的解决方案更优雅。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM