2012-01-03 8 views
1

Следующий фрагмент кода выдает сообщение об ошибке во время выполнения из:Vector итератора не разыменовываемое при смене итератора comparisson

Debug утверждения не удалось: Vector итератора не разыменовываемое

for(it=stat1vec.begin(); *(it)>=investigated_stat; it++, positioner++) 
    { 


     if(*it==investigated_stat) 
      equalwith++; 

    } 

Когда изменено:

for(it=stat1vec.begin(); *(it)==investigated_stat; it++, positioner++) 
     { 


      if(*it==investigated_stat) 
       equalwith++; 

     } 

Код работает отлично.

Все было сделано, чтобы изменить> = == к

Почему это?

Большое спасибо

+1

'=' это задание, я думаю, что вы имели в виду использовать '== ', правильно? Кроме того, лучше использовать '++ it', чем' it ++' на итераторах, чтобы избежать создания временного объекта. – hochl

+1

@hochl оптимизатор, скорее всего, исключает временное, независимо от оператора. –

+0

Приятно привыкать. –

ответ

3

Вы должны испытать для итератора быть действительный итератор, прежде чем разыменования его. Ваш цикл будет продолжаться до *it < investigated_stat, но он не остановится, когда ни один из элементов не будет >= investigated_stat, и вы пропустите мимо конца вектора.

Тест в цикл должен быть

it != stat1vec.end() && *it >= investigated_stat 

Что делает слегка модифицированный for:

for(it = stat1vec.begin(); it != stat1vec.end() && *it >= investigated_stat; ++it, ++positioner) 
    if(*it == investigated_stat) 
     ++equalwith; 
2

Кажется, в какой-то момент до достижения конца вектора вы присвоили ноль *(it) : в этот момент цикл завершается. Логическое сравнение пыталось найти что-то другое - и потерпело неудачу. Я предполагаю, что вы хотели написать == во втором цикле.

Обратите внимание, что идиоматических способ перебрать последовательность (если не с помощью алгоритмов, то есть) выглядит примерно так:

for (it = v.begin(), end = v.end(); it != end /* possible additional conditions */; ++it) 
{ 
    ... 
} 
+0

Kuhl Да, я скопировал и вставлял из своего компилятора некорректно, как-то, на мой конец. –