Упражнение с векторным фрагментом кода, включает цикл for - PullRequest
1 голос
/ 29 февраля 2012

Прежде всего, это НЕ домашняя работа. Я использую книгу, которую я купил для себя, чтобы изучить начало C ++ дома, и она содержит упражнение, с которым я застрял. Он спрашивает меня, что не так со следующим кодом, но я не уверен, правильно ли я смотрю.

Это упражнение и код:

Предполагая, что Scores является вектором, который содержит элементы типа int, что не так со следующим фрагментом кода (предназначен для увеличения каждого элемент)?

vector<int>::iterator iter;
for (iter = scores.begin(); iter != scores.end(); ++iter)
{
  iter++;
}

Я предполагаю, что 'iter ++' вставляется в функцию for И в блок for, что будет означать, что он будет введен два раза и, следовательно, пройдет за конец цикла. Это правильно?

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Вы правы.Проблема с этим кодом заключается в том, что итератор увеличивается внутри цикла, а также после выполнения тела цикла.

Что код должен сделать, это увеличить значение, сохраненное в местоположенииитератора внутри цикла, поэтому нам нужно разыменовать его.

(*iter)++
1 голос
/ 29 февраля 2012

Иногда он проходит через конец массива, да.

Если есть четное количество элементов, вам повезло, так как оно достигнет состояния остановки.Для нечетного числа элементов вы вызываете UB.

0 голосов
/ 29 февраля 2012

iter++ совпадает с std::advance(iter,1) и перемещает итератор вперед, указывая на следующий элемент вектора.Это то же самое, что и ++iter.

. Вам нужен доступ к элементу, на который указывает iter: используйте для доступа operator*:

++*iter; // or
(*iter)++;

Обратите внимание,В исходном сообщении ваш цикл никогда не закончится, если в вашем векторе будет нечетное количество элементов.

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