我想在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();
}
}
答案 0 :(得分:2)
这两行代码:
"writePlus \"asdf\""
声明 queue<int> Q;
queue<int> dump = Q;
和Q
为dump
对象。 queue
默认初始化为 empty 队列,而Q
初始化为dump
(空)的副本。
以下四行:
Q
将四个数字 Q.push(1);
Q.push(2);
Q.push(3);
Q.push(4);
,1
,2
和3
推入4
对象中但不要更改 Q
对象。
在您的dump
循环中,“ initial”语句for
将dump = Q;
对象(4次按下后已调整)复制到Q
中(覆盖现有的空白对象),因此循环会打印出四个条目。但是,dump
循环没有该初始语句,因此while
对象保持原始分配(初始化)中的状态-空!
要解决此问题,您可以执行以下两项操作之一。
dump
调用之后,将dump
的声明/定义(及其初始化)移动到 。然后,这会将“填充的” Q.push()
对象复制到Q
。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
行的位置)。