我想用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;
将Q
和dump
声明为queue
对象。默认情况下,Q
初始化为empty队列,dump
初始化为(空)Q
的副本。
以下四行:
Q.push(1);
Q.push(2);
Q.push(3);
Q.push(4);
将1
,2
,3
和4
这四个数字推入Q
对象但不要更改 dump
对象。
在您的for
循环中,使用“初始”语句,dump = Q;
将Q
对象(4次按入后现在进行调整)复制到dump
中(覆盖现有的空对象),因此该循环将打印出四个条目。但是,while
循环没有该初始语句,因此dump
对象保持原始分配(初始化)中的状态-这是空的!
要解决此问题,您可以执行以下两项操作之一。
dump
的声明/定义(及其初始化)移动到之后四个Q.push()
调用。然后,这会将“填充的” Q
对象复制到dump
。dump
声明为queue
的reference。然后,每当您将另一个queue
对象“分配”给它时(例如,在dump = Q
中),对Q
所做的任何更改都会反映在dump
中(因为refers原始对象)。要使用引用方法,请使用以下语法(这是您需要对代码进行的[[only更改):]] queue<int>& dump = Q;
添加的&
字符是声明dump
作为参考的字符。 (这在很多方面都像指针一样起作用,但是您不需要像指针*
那样使用显式 [More info from Wikipedia]来引用它。)
但是请注意
:如Alexander Zhang所指出的,如果您使用第二种(参考)方法,则对dump
进行的[[all更改将< [也设为Q
(因为dump
仍引用至Q
);因此循环中的dump.pop();
行实际上会从Q
中弹出值(因此Q
将被清空)。如果您不希望这样做,则应该使用上面的第一种方法(移动queue<int> dump = Q;
行的位置)。