队列和堆栈中的交换函数:它是复制每个元素还是交换地址? C++

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

我一直在研究队列和堆栈,作为练习,我尝试使用另一个(堆栈与队列和队列与堆栈)来实现它们。可以使用 1 个队列或 1 个堆栈来完成此操作,但我目前使用 2 个队列或堆栈来完成。创建push()函数时,由于有2个队列/堆栈,每次使用后其中一个队列/堆栈被填满,另一个则没有。 (例如:在第一个push()中q1为空q2在下一个push()中填充q1已填充q2为空)在push()函数结束时,我需要交换它们,以便我始终可以使用相同的队列/堆栈用于其他操作。

我想知道的是,如果我使用 std::swap() 函数,它是复制每个元素来交换队列/堆栈还是只是交换地址。

目前,我只是使用了 p1 和 p2 指针并交换了它们的值,但这样做我必须在整个代码中继续使用所述指针,如下所示。我问这个问题是因为如果 std::swap() 函数正在更改地址,我可以简单地使用它而不用担心指针。

private:
    queue<int> q1, q2;
    queue<int>* p1 = &q1;
    queue<int>* p2 = &q2;
public:
    MyStack() {
        //constructor
    }
    
    void push(int x) {
        (*p2).push(x);
        while(!(*p1).empty())
        {
            (*p2).push((*p1).front());
            (*p1).pop();
        }

        //swap
        queue<int>* temp = p1;
        p1 = p2;
        p2 = temp;

    }

这是一个小练习,所以到处都有指针只是一个小小的不便,但在一个更大的项目中,我可以通过使用 std::swap() 来节省时间,而不是使用这么多指针或实现我自己的交换函数(如果它交换地址)交换元素本身。

c++ queue stack swap
1个回答
0
投票

我手动测试了队列的地址,在调用

swap(q1, q2)
q1.swap(q2)
函数后,地址保持不变,因此交换函数没有交换指针,因此交换函数的工作方式不同。

编译器:g++ (GCC) 13.2.1 20230801

代码:-

queue<int> q1;
queue<int> q2;

q1.push(1);
q2.push(4); q2.push(2);

auto x = &q1;
auto y = &q2;
cout << "before \n";
cout << x << endl;
cout << y << endl;
cout << "sizes: q1: " << q1.size() << " " << "q2: " << q2.size() << endl;
cout << "after\n";
swap(q1, q2);
x = &q1;
y = &q2;
cout << x << endl;
cout << y << endl;
cout << "sizes: q1: " << q1.size() << " " << "q2: " << q2.size() << endl;

输出

之前 0x7ffd9a272720 0x7ffd9a272770 尺寸: q1: 1 q2: 2 后 0x7ffd9a272720 0x7ffd9a272770 尺寸:q1:2 q2:1

© www.soinside.com 2019 - 2024. All rights reserved.