простая программа deque демонстрирует странное поведение

0

Я использую 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++;
    }


}

Спасибо за помощь, я уже понял проблему

Теги:
debugging
stl
deque

5 ответов

2
Лучший ответ

Вам нужно распечатать значение, содержащееся в итераторе, а не i:

while (d2 != deq.end() )
{
    // wrong!
    //cout<<i
    //    <<endl;

    cout << *d2 << endl;

        d2++;
}

В качестве дополнительной заметки это иллюстрирует, почему вы должны всегда ограничивать область действия переменных до наименьшей возможной области. Если бы ваш оригинальный цикл был объявлен как:

for(int i = 1; i <= 10; ++i)

Затем попытка распечатать i (некорректно) позже была бы ошибкой времени компиляции.

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


}
1

Вы должны заменить это

cout << i << endl;

с чем-то, что фактически удаляет вещи из dequeue:

cout << deq.pop_front() << endl;

Чтобы избежать простых ошибок, подобных этому в будущем, ограничьте область переменных индекса цикла, объявив их внутри заголовка цикла:

for (int i= 1 ;i <=10 ;i++)
{
   deq.push_front(i);
}

Таким образом, вы получите ошибку компиляции, пытающуюся ссылаться на i вне цикла.

1

Вы печатаете i, который был назначен i=11 в цикле for.

0

Если вы печатаете я внутри цикла while, он всегда производит 11, потому что выше вашего кода. Вы уже используете int я в цикле for, с последним значением 10. Отлаживайте свой код с помощью инструментов ddebugging в своем редакторе, вы будете знать, что вы делаете неправильно.

while (d2 != deq.end() )
{
cout<<i<<endl;
d2++;
}

Вышеизложенное всегда производит 11 итераций.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню