Я использую deque для хранения целых чисел от 1 до 10 и вывод на консоль с 1 по 10, но по какой-то неизвестной причине он выводит 11 для каждого цикла. Я не могу понять, что я делаю неправильно.
#include <iostream>
#include <cstring>
#include <deque>
using namespace std;
int main()
{
deque <int> deq;
int i;
for ( i= 1 ;i <=10 ;i++)
{
deq.push_front(i);
}
deque <int>::iterator d2;
d2 = deq.begin();
while (d2 != deq.end() )
{
cout<<i
<<endl;
d2++;
}
}
Спасибо за помощь, я уже понял проблему
Вам нужно распечатать значение, содержащееся в итераторе, а не i
:
while (d2 != deq.end() )
{
// wrong!
//cout<<i
// <<endl;
cout << *d2 << endl;
d2++;
}
В качестве дополнительной заметки это иллюстрирует, почему вы должны всегда ограничивать область действия переменных до наименьшей возможной области. Если бы ваш оригинальный цикл был объявлен как:
for(int i = 1; i <= 10; ++i)
Затем попытка распечатать i
(некорректно) позже была бы ошибкой времени компиляции.
int main()
{
deque <int> deq;
int i;
for ( i= 1 ;i <=10 ;i++)
{
deq.push_front(i);
}
===> i
здесь 11 (i <= 10)
ложно на 11
deque <int>::iterator d2;
d2 = deq.begin();
===> здесь вы действительно хотите использовать d2
while (d2 != deq.end() )
{
cout<<i
===> здесь вы печатаете i
вместо d2
<<endl;
d2++;
}
}
Вы должны заменить это
cout << i << endl;
с чем-то, что фактически удаляет вещи из dequeue:
cout << deq.pop_front() << endl;
Чтобы избежать простых ошибок, подобных этому в будущем, ограничьте область переменных индекса цикла, объявив их внутри заголовка цикла:
for (int i= 1 ;i <=10 ;i++)
{
deq.push_front(i);
}
Таким образом, вы получите ошибку компиляции, пытающуюся ссылаться на i
вне цикла.
Вы печатаете i
, который был назначен i=11
в цикле for
.
Если вы печатаете я внутри цикла while, он всегда производит 11, потому что выше вашего кода. Вы уже используете int я в цикле for, с последним значением 10. Отлаживайте свой код с помощью инструментов ddebugging в своем редакторе, вы будете знать, что вы делаете неправильно.
while (d2 != deq.end() )
{
cout<<i<<endl;
d2++;
}
Вышеизложенное всегда производит 11 итераций.