Сброс цикла в цикле

Мне очень любопытно узнать, почему приведенный ниже код не работает в непрерывном цикле. И я также ищу некоторые способы достижения того, чего я хочу достичь — сброса цикла внутри цикла. Мне нужно сделать это, потому что мне нужно учитывать каждый элемент в контейнере. Причина в том, что я могу начать с середины, и мне нужно вернуться назад, чтобы проверить остальных / и мне нужно перепроверить и другую информацию. Итак, мой маленький тестовый пример:

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

Я ценю любые отзывы, которые ТАК может предложить, и любые новые вещи для изучения 🙂 Если потребуется дополнительная информация, я предоставлю. Спасибо за ваше время.

0

Решение

Потому что условие проверяется перед вводом тела цикла. когда 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 блок.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector