擦除矢量时出现分段错误

Posted

技术标签:

【中文标题】擦除矢量时出现分段错误【英文标题】: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 不为空时,您想从其中删除一些内容吗?如果那个是空的呢? 【参考方案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()))

【讨论】:

以上是关于擦除矢量时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

删除时出现分段错误

分配时出现分段错误[重复]

在 C++ 中使用向量时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11

返回指针时出现分段错误[重复]

呈现窗口时出现 Gtkmm 分段错误