我一直在研究队列和堆栈,作为练习,我尝试使用另一个(堆栈与队列和队列与堆栈)来实现它们。可以使用 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() 来节省时间,而不是使用这么多指针或实现我自己的交换函数(如果它交换地址)交换元素本身。
我手动测试了队列的地址,在调用
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