Ошибка сегментации при стирании вектора - PullRequest
0 голосов
/ 20 февраля 2012
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 ]

5 голосов
/ 20 февраля 2012

Используйте && вместо ||:

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

Без этого вы входите в цикл while, когда один из векторов пуст, и впоследствии пытаетесь получить доступ к элементу, которого там нет.

2 голосов
/ 20 февраля 2012
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];
}
2 голосов
/ 20 февраля 2012

Использование &&:

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];
0 голосов
/ 20 февраля 2012

Условие ниже:

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

Это условие не проверяет, является ли vector пустым или нет.Если один из vector s будет опустошен, то вы получите доступ к запрещенному месту (либо v1[0], либо v2[0]).Таким образом, ваше состояние должно быть как:

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