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

问题描述 投票:1回答:1

我想用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();
    }
}
c++ stl queue
1个回答
2
投票

这两行代码:

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

Qdump声明为queue对象。默认情况下,Q初始化为empty队列,dump初始化为(空)Q的副本。

以下四行:

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

1234这四个数字推入Q对象但不要更改 dump对象。

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

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

  1. dump的声明/定义(及其初始化)移动到之后四个Q.push()调用。然后,这会将“填充的” Q对象复制到dump
  2. 您可以将dump声明为queuereference。然后,每当您将另一个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;行的位置)。
© www.soinside.com 2019 - 2024. All rights reserved.