【问题标题】:C++ Vector.erase() causing segmentation faultC++ Vector.erase() 导致分段错误
【发布时间】:2014-07-06 21:02:45
【问题描述】:

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

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

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

【问题讨论】:

  • 你真正的逻辑问题当然是你不应该增加i
  • 这段代码中没有任何东西会突然导致段错误。 (当然它并没有真正擦除所有的空项目)。您的程序中一定还有其他问题(例如,较早的堆损坏,或者向量中的对象没有正确的值符号)。
  • 一旦 STL 的 uniform container erasure 成为标准,我们就可以说 std::erase_each_if(myvector, std::mem_fn(&amp;std::string::empty));...
  • @KerrekSB,酷,不知道这是一回事。我已经有了它的功能,但仍然。
  • @chris:当然,everyone 已经有了这个功能——这就是为什么它被考虑标准化的原因 ;-)

标签: c++ vector segmentation-fault


【解决方案1】:

您似乎想要通常的删除 - 擦除习语:

#include <algorithm>
#include <functional>

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您的迭代器正在失效。 myvector[i] 无效。 (还有interatorlol)
    • @FedericoReghenzani 也感谢您的回答。起初我无法让它工作,但现在可以了。
    • 1) 常量迭代器就足够了; 2)*i == "" 看起来很笨拙,为什么不是i-&gt;empty()
    • 如果您对段错误感到疑惑,请将其与 this one 进行比较。
    • @chris 我刚刚编辑了同样的更正 :) 感谢所有 cmets 并为错误道歉
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-25
      • 2011-02-25
      • 1970-01-01
      相关资源
      最近更新 更多