Я пытаюсь сделать обратный цикл по списку, используя while. Я пробую следующий код:
#include <iostream>
#include <list>
int main(){
std::list <int> l1 = {1,2,3,4};
auto it1 = l1.end();
int val1;
int sum1=0, exp1=1;
int i = 0;
while( it1 != l1.begin() ){
--it1;
val1 = *it1;
sum1 += val1 * exp1;
exp1 *= 10;
i++ ;
}
std::cout << sum1 << std::endl;
return 0;
}
Он перенастраивает 1234, хотя я ожидал противоположного: 4321.
Почему это? Как заставить его работать с циклом while?
1. Используйте комбинацию rbegin()/rend() для повторения в обратном направлении. 2. Если вы действительно не хотите использовать обратные итераторы, проверьте, что происходит с exp1 в ходе итераций.
Как говорит @500-InternalServerError, проблема не в вашей итерации, а в вашем сложении и умножении. Должно быть sum1 = sum1 * 10 + val1;
Есть ли какая-то конкретная причина использовать std::list вместо std::vector?
Если вы хотите увидеть, что обрабатывает итерация, просто используйте std::cout << val1 << '\n'; в цикле.
Это сработало, Спасибо. 500-InternalServerError, alagner, Barmar, @Chris Я просто изучаю C++, чтобы понимать списки, вектор должен быть проще. @ Бармар, да, я думал, проблема в итерации. :(
Это приятно понимать std::list. Одна из вещей, которую следует понимать, это то, что вы, вероятно, не часто встретите это в идиоматическом C++. :) reddit.com/r/programming/comments/25xpre/…





Это утверждение:
sum1 += val1 * exp1;
дает результат 1234.
То есть на первой итерации цикла while вы получаете, что sum1 равна 4. Затем на второй итерации цикла while вы фактически имеете согласно приведенному выше утверждению:
sum = 4 + 3 * 10;
в результате получается 34 и так далее.
Вместо этого вам нужно написать
sum = sum * exp1 + val1;.
Вы можете оставить заявление:
sum1 += val1 * exp1;
как если бы вы написали цикл while следующим образом:
auto it1 = l1.begin();
//...
while( it1 != l1.end() ){
//...
Другой подход — использовать цикл for на основе диапазона:
for ( const auto &val1 : l1 )
{
sum1 += val1 * exp1;
exp1 *= 10;
}
И если вы используете этот последний подход к итерации, вы можете просто использовать цикл for на основе диапазона.
@Chris Крис, я пишу это решение, когда ты написал комментарий. :)
Либо «великие умы думают одинаково», либо «маленькие умы редко расходятся во мнениях».
Почему ты этого ожидал? Первое обрабатываемое значение — 4, которое умножается на 1, затем 3, умножается на 10 и так далее.