Почему я получаю ошибку «векторный итератор + смещение вне диапазона»? - PullRequest
3 голосов
/ 25 марта 2012

Следующий код вызывает эту ошибку:

if (bestLine.size() > searchDepth - depth)
    bestLine.erase(bestLine.begin(), bestLine.end() - searchDepth - depth);

Когда я проверял значение searchDepth - depth во время ошибки, оно было 0.

Так что по сути,

if (bestLine.size() > 0)
    bestLine.erase(bestLine.begin(), bestLine.end());

вызывает эту ошибку.(Или нет. См. Комментарии ниже.)

Насколько мне известно, вышеприведенный код должен стереть весь вектор, что в данном случае является желаемым поведением.

Что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 25 марта 2012

Попробуйте добавить в выражение круглые скобки: bestLine.end() - (searchDepth - depth).Результат очень отличается, если просто оценить слева направо.

1 голос
/ 25 марта 2012

Это не проблема кодирования, а математическая.

Проблемная математика:

   bestLine.end() - searchDepth - depth
=> bestLine.end() + (-1) * searchDepth + (-1) * depth
=> bestLine.end() + (-1) * (searchDepth + depth)
=> bestLine.end() - (searchDepth + depth)

Таким образом, вместо того чтобы пытаться стереть (searchDepth - глубина) элементы, вы пытались стереть (searchDepth + глубина) элементы.

Правильная математика:

  bestLine.end() - (searchDepth - depth)
1 голос
/ 25 марта 2012

Вы проверяете, больше ли bestLine.size (), чем searchDepth - глубина, но затем вычитаете searchDepth + глубину. Измените знак перед глубиной в вычитании: bestLine.erase(bestLine.begin(), bestLine.end() - searchDepth *+* depth);

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