擦除矢量时出现分割错误

Segmentation fault while erasing vector

本文关键字:分割 错误 擦除      更新时间:2023-10-16
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

使用 &

& 代替 ||:

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

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

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];
}

使用 &&

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];

以下条件:

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

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

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