为什么当我使用“ for循环”而不显示“ while循环”时显示队列的内容?

时间:2019-12-22 17:26:15

标签: c++ stl queue

我想在C ++中显示队列的内容,因此我决定将队列复制到一个临时队列中,然后显示新队列重复弹出操作的元素。但是以下代码仅在我使用for循环时显示输出。

#include<iostream>
#include<queue>
using namespace std;

int main()
{
    queue<int> Q;
    queue<int> dump = Q;

    Q.push(1);
    Q.push(2);
    Q.push(3);
    Q.push(4);

    // for (dump = Q; !dump.empty(); dump.pop())   //THIS WORKS
    //     cout << dump.front() << '\n';

    while(!dump.empty())              //THIS DOES NOT
    { 
        cout << dump.front() << '\n';
        dump.pop();
    }
}

1 个答案:

答案 0 :(得分:2)

这两行代码:

"writePlus \"asdf\""

声明 queue<int> Q; queue<int> dump = Q; Qdump对象。 queue默认初始化为 empty 队列,而Q初始化为dump(空)的副本。

以下四行:

Q

将四个数字 Q.push(1); Q.push(2); Q.push(3); Q.push(4); 123推入4对象中但不要更改 Q对象。

在您的dump循环中,“ initial”语句fordump = Q;对象(4次按下后已调整)复制到Q中(覆盖现有的空白对象),因此循环会打印出四个条目。但是,dump循环没有该初始语句,因此while对象保持原始分配(初始化)中的状态-空!

要解决此问题,您可以执行以下两项操作之一。

  1. 在四个dump调用之后,将dump的声明/定义(及其初始化)移动到 。然后,这会将“填充的” Q.push()对象复制到Q
  2. 您可以将dump声明为对dump 引用 。然后,每当您向其“分配”另一个queue对象(例如,在queue中)时,您对dump = Q所做的任何更改都会反映在Q中(因为它引用到原始对象)。

要使用引用方法,请使用以下语法(这是您需要对代码进行的仅 更改)

dump

添加的 queue<int>& dump = Q; 字符是声明&作为引用的字符。 (这在很多方面都像指针一样起作用,但是您不需要像指针 [More info from Wikipedia]那样使用显式dump来引用它。)

但请注意:如Alexander Zhang所指出,如果您使用第二种(参考)方法,则 all 然后,您对*进行的更改也会对{{1}进行 (因为dump仍然引用Q);因此循环中的dump行实际上会从Q中弹出值(因此dump.pop();将被清空)。如果您不希望这样做,则应使用上面的第一种方法(移动Q行的位置)。