为什么 size() 在与其他堆栈交换元素后提供错误的堆栈大小?

Why does size() provide a wrong size of stack after swapping elements with other stack?

本文关键字:堆栈 错误 交换 size 为什么 其他 元素      更新时间:2023-10-16

我目前正在学习C++STL容器,我正在尝试交换两个堆栈的内容,然后输出它们。我用来输出其中一个堆栈元素的第二个 for 循环有一个奇怪的行为,我无法向自己解释 - 为什么 for 循环只迭代 2 次,当 myStack2.size() = 3 时?

#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> myStack;
myStack.push(5);
myStack.push(33);
myStack.push(6);
cout << "myStack size: " << myStack.size() << endl;
stack<int> myStack2;
myStack2.push(69);
cout << "myStack2 size: " << myStack2.size() << endl;
myStack2.swap(myStack);
cout << "myStack size after swap: " << myStack.size() << endl;
cout << "myStack2 size after swap: " << myStack2.size() << endl;
cout << "myStack contents: " << endl;
for(int i = 0; i < myStack.size(); ++i) {
cout << myStack.top() << endl;
myStack.pop();
}
cout << "myStack2 contents: " << endl;
for(int j = 0; j < myStack2.size(); ++j) {
cout << j << ". iteration: ";
cout << myStack2.top() << endl;
myStack2.pop();
}
cout << "myStack2 size after output iterations: " << myStack2.size() << endl;
}

输出:

myStack size: 3
myStack2 size: 1
myStack size after swap: 1
myStack2 size after swap: 3
myStack contents: 
69
myStack2 contents: 
0. iteration: 6
1. iteration: 33
myStack2 size after output iterations: 1

如您所见,myStack2 只有两次迭代,其中仍有 1 个元素 (5)。有人可以向我解释这种行为吗?

每次调用 pop() 时,都会减小堆栈的大小。因此,第一次在循环中比较 j (0) 和 size(3)。第二次,j(1)的大小为(2)。第三次循环条件为假,因为 j 为 2,大小为 1

代码的基本问题是每次迭代时都要重新评估相应堆栈的大小(同时检查for循环的条件)。
在迭代i弹出堆栈的一个元素,在迭代i+1再次评估堆栈的大小,现在比原始大小小一个。
以下更改将对您有所帮助。

int myStack_size = myStack.size(), myStack2_size = myStack.size();
cout << "myStack contents: " << endl;
for(int i = 0; i < myStack_size; ++i) {
cout << myStack.top() << endl;
myStack.pop();
}
cout << "myStack2 contents: " << endl;
for(int j = 0; j < myStack2_size; ++j) {
cout << j << ". iteration: ";
cout << myStack2.top() << endl;
myStack2.pop();
}
cout << "myStack2 size after output iterations: " << myStack2.size() << endl;