Мне очень любопытно узнать, почему приведенный ниже код не работает в непрерывном цикле. И я также ищу некоторые способы достижения того, чего я хочу достичь — сброса цикла внутри цикла. Мне нужно сделать это, потому что мне нужно учитывать каждый элемент в контейнере. Причина в том, что я могу начать с середины, и мне нужно вернуться назад, чтобы проверить остальных / и мне нужно перепроверить и другую информацию. Итак, мой маленький тестовый пример:
for ( int i = 0; i != 10; i++ ) {
std::cout << std::endl << "TEST: " << i << std::endl;
if ( i++ == 10 ) {
i = 0;
} else {
i--;
}
}
Есть ли какая-то конкретная причина, почему выше не работает? Мне очень интересно знать почему, поэтому я могу узнать, как все работает. Это также приводит к гораздо большей проблеме, с которой я сталкиваюсь. Какой код ниже. Я использую MSVC ++ 2010 Express. Кроме того, это один поток, поэтому другие данные не имеют к нему доступа. Это unordered_map, использующий STL. его размер, если 2 (я проверил).
for (game_player_client_map::const_iterator it = gpc_map_ptr->begin(); it != gpc_map_ptr->end(); ++it) {
if ( it++ == gpc_map_ptr->end() ) {
cout << endl << "IT == gpc_map_ptr->end()" << endl;
it = gpc_map_ptr->begin();
} else {
it--;
}
}
Я ценю любые отзывы, которые ТАК может предложить, и любые новые вещи для изучения 🙂 Если потребуется дополнительная информация, я предоставлю. Спасибо за ваше время.
Потому что условие проверяется перед вводом тела цикла. когда i == 10
, цикл прерывается, прежде чем ваш код может выполняться в то время, когда i++
оценил бы до 10.
Помните, что postincrement увеличивает переменную и возвращает старое значение. Так что если i
это 9, i++
оценивает до 9 также, но в следующий раз вы используете i
будет 10.
Если вы хотите, чтобы переменная была увеличена и использовать новое значение в выражении, используйте preincrement:
if (++i == 10) // changes i to i + 1 and checks if the new value of i is 10
Однако вы можете полностью отказаться от приращения и просто использовать i + 1
, Таким образом, вам не нужно уменьшать приращение i
в else
блок.
Ваше неправильное понимание postincrement, вероятно, также является источником ошибки во втором блоке кода, который вы опубликовали. Вы можете изменить его на preincrement, или если it
является итератором с произвольным доступом, вы можете сделать то же самое, что указано выше, и проверить, it + 1 == gpc_map_ptr->end()
и не нужно уменьшать it
в else
блок.
Других решений пока нет …