2009-05-16 3 views
3

У меня есть циклГде этот код разыменовывает недействительный итератор? (C++)

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() является ложной. Я не знаю, что произойдет, если инструкция if() верна.

ответ

8

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

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

Возьмите небольшой пример здесь:

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

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

Вы хотите увеличить я (или в случае А.И) во внешнем контуре, как так:

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

vI всегда два, aI начинается в 0. Спасибо – 2009-05-16 03:13:22

1

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

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

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

Смежные вопросы