gpt4 book ai didi

c++ - 为什么队列的内容在我使用 "for loop"时显示,但在我使用 "while loop"时不显示?

转载 作者:行者123 更新时间:2023-12-02 10:07:31 25 4
gpt4 key购买 nike

我想在 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();
}
}

最佳答案

这两行代码:

    queue<int> Q;
queue<int> dump = Q;

声明 Qdump成为 queue对象。 Q默认初始化为空队列和 dump初始化为(空) Q 的拷贝.

以下四行:

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

推四个号码, 1 , 2 , 34进入 Q对象 但不要改变 dump目的。

在您的 for循环,“初始”语句, dump = Q;复制 Q对象(现在在 4 次插入后调整)到 dump (覆盖现有的空对象),因此循环打印出四个条目。但是, while循环没有那个初始语句,所以 dump对象保持原样(初始化) - 这是空的!

要解决此问题,您可以执行以下两项操作之一。
  • 移动 dump 的声明/定义(连同其初始化)到四个 Q.push() 之后来电。这将复制“填充”Q反对dump .
  • 您可以声明dump作为 引用 queue .然后,每当您“分配”另一个 queue反对它(例如,在: dump = Q 中),您对 Q 所做的任何更改将反射(reflect)在 dump (因为它指的是原始对象)。

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

        queue<int>& dump = Q;

    添加的 &字符是声明 dump作为引用。 (这在很多方面都有效,就像一个指针,但你不需要显式的 * 来尊重它,就像使用指针 [More info from Wikipedia] 一样。)

    但请注意 : 正如 Alexander Zhang 所指出的, 如果你使用第二种(引用)方法,那么 全部 然后您对 dump 所做的更改将 还有发给 Q (因为 dump 仍指 Q );所以 dump.pop();循环中的行 - 实际上 - 从 Q 弹出值(因此 Q 将被清空)。如果你不想这样,那么你应该使用上面的第一种方法(移动 queue<int> dump = Q; 行的位置)。

    关于c++ - 为什么队列的内容在我使用 "for loop"时显示,但在我使用 "while loop"时不显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59446492/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com