简单的双端程序表现出奇怪的行为

时间:2013-11-26 03:08:44

标签: c++ debugging stl deque

我使用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++;
    }


}

感谢您的帮助,我已经理解了问题

5 个答案:

答案 0 :(得分:2)

您需要打印出迭代器包含的值,而不是i

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

    cout << *d2 << endl;

        d2++;
}

作为旁注,这说明了为什么您应该始终将变量的范围限制在尽可能小的范围内。如果您的原始循环声明为:

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

然后尝试打印i(错误地)以后将是编译时错误。

答案 1 :(得分:1)

您正在打印i,该i=11已在for循环中分配到{{1}}。

答案 2 :(得分:1)

你应该替换这个

cout << i << endl;

实际上从出队中移除了一些东西:

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

为了避免将来出现这样的简单错误,请通过在循环头中声明它们来限制循环索引变量的范围:

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

这样你就会在循环外引用i时遇到编译错误。

答案 3 :(得分:1)

int main()
{
    deque <int> deq;

    int i;

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

===&GT;这里i为11 (i <= 10)在11

时为假
    deque <int>::iterator d2;

    d2 = deq.begin();

===&GT;在这里你真的想使用d2

    while (d2 != deq.end() )
    {
        cout<<i

===&GT;在这里打印i而不是d2

             <<endl;


            d2++;
    }


}

答案 4 :(得分:0)

如果你在while循环中打印i,它会产生11,因为在你的代码之上。你已经在for循环中使用了int i,最后一个值为10.再次使用ddebugging工具在你的编辑器中调试代码,你就会知道你做错了什么。

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

以上同时每次迭代总是产生11次。