Векторный итератор не может быть отменен при изменении сравнения итератора - PullRequest
1 голос
/ 03 января 2012

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

Ошибка отладки: векторный итератор не разыменовывается

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

        }

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

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

Почему это?

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

Ответы [ 2 ]

3 голосов
/ 03 января 2012

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

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

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 голосов
/ 03 января 2012

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

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

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