Где этот код разыменовывает недействительный итератор? (C ++) - PullRequest
3 голосов
/ 16 мая 2009

у меня есть петля

for(aI = antiviral_data.begin(); aI != antiviral_data.end();)
{
    for(vI = viral_data.begin(); vI != viral_data.end();)
    {
        if((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y)
        {
            vI = viral_data.erase(vI);
            aI = antiviral_data.erase(aI);
        }
        else
        {
            vI++;
            aI++;
        }
    }
}

Но когда antiviral_data содержит элемент, я получаю ошибку «векторный итератор не разыменовывается» Почему я получаю эту ошибку и где я разыменую неверный итератор?

NB. Пока ошибка возникает только тогда, когда оператор if () имеет значение false. Я не знаю, что произойдет, если утверждение if () верно.

Ответы [ 2 ]

8 голосов
/ 16 мая 2009

Каковы размеры векторов?

Если у viral_data больше элементов, чем у antiviral_data, то, поскольку вы увеличиваете aI и vI с одинаковой скоростью, aI выходит за пределы, прежде чем цикл vI завершится.

Вот краткий пример:

for(int i = 0; i < 5;)
{
    for(int j = 0; j < 10;)
    {
        i++;
        j++;
    }
}

Если вы пройдете по циклам for, вы заметите, что внутренний цикл не закончится, пока j и i не будут равны 10, но в соответствии с вашим внешним циклом я должен not быть больше 5.

Вы захотите увеличить i (или, в вашем случае, aI) во внешнем цикле следующим образом:

for(int i = 0; i < 5;)
{
    for(int j = 0; j < 10;)
    {
        j++;
    }
    i++;
}
1 голос
/ 01 февраля 2010

Разыменование происходит в

((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y)

, и это происходит, когда это утверждение верно для последнего элемента в списке antiviral_data. В этом случае на следующей итерации внутреннего цикла for вы будете разыменовывать antiviral_data.end(), что недопустимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...