【问题标题】:Segmentation fault while erasing vector擦除矢量时出现分段错误
【发布时间】:2012-02-20 04:59:32
【问题描述】:
while(!v1.empty() || !v2.empty())
{
    int k=0;        
    if(v1[k] < v2[k])
        v1.erase(v1.begin());
    else
        v2.erase(v2.begin());
    cout<<v1[0];
}

这是我的代码 在这里我想删除元素,直到其中一个为空(向量已排序), 就像如果

v1 包含 2,3,5,8

v2 包含 3,4,7

那么根据我的说法,它应该给我8,但它给了segmentation fault

【问题讨论】:

  • 你试过在调试器下运行它吗?
  • 所以当v1 不为空或v2 不为空时,您想从其中删除一些内容吗?如果那个是空的呢?

标签: c++ vector segmentation-fault


【解决方案1】:

使用 && 代替 ||:

while( !v1.empty() && !v2.empty())

当其中一个向量为空时,您不会进入 while 循环,然后尝试访问不存在的元素。

【讨论】:

    【解决方案2】:
    while(!v1.empty() && !v2.empty())
    {
        int k=0;        
        if(v1[k] < v2[k])
            v1.erase(v1.begin());
        else
            v2.erase(v2.begin());
    }
    if (!v1.empty()) {
        cout << v1[0];
    } else if (!v2.empty()) {
        cout << v2[0];
    }
    

    【讨论】:

      【解决方案3】:

      使用&amp;&amp;:

      while( !v1.empty() && !v2.empty())
      {
          ...
      }
      

      第二次失败是你在erase之后使用v1[0]。如果erase 删除了向量v1 的最后一个元素,那么v1[0] 会导致未定义的行为。

      if(v1[0] < v2[0])
          v1.erase(v1.begin());
      else
          v2.erase(v2.begin());
      cout << v1[0];
      

      【讨论】:

        【解决方案4】:

        以下条件:

        if(v1[k] < v2[k])
        

        此条件不检查 vector 是否已经为空。如果vectors 之一被清空,那么您正在访问一个禁止的位置(v1[0]v2[0])。所以你的情况应该是这样的:

        while(!(v1.empty() || v2.empty()))
        

        【讨论】:

          猜你喜欢
          • 2017-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-01
          • 1970-01-01
          • 2017-04-17
          • 1970-01-01
          相关资源
          最近更新 更多