擦除矢量时的分段故障

时间:2012-02-20 04:59:33

标签: c++ vector segmentation-fault

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

4 个答案:

答案 0 :(得分:5)

使用&amp;&amp;而不是||:

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

如果没有它,当其中一个向量为空时,你进入while循环,然后尝试访问不存在的元素。

答案 1 :(得分:2)

使用&&

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

第二个问题是您在v1[0]之后使用erase。如果erase删除了向量v1的最后一个元素,则v1[0]会导致未定义的行为。

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

答案 2 :(得分: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 :(得分:0)

以下条件:

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

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

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