为什么 size() 在与其他堆栈交换元素后提供错误的堆栈大小?
Why does size() provide a wrong size of stack after swapping elements with other stack?
我目前正在学习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;
相关文章:
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈中大小变量输入错误 (C++)
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++运行时错误与快速排序算法抛出堆栈转储错误
- MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- 使用堆栈从黑客等级中解决平衡括号检查的错误
- 如何在构建对象堆栈时解决转换错误?
- 如何修复递归函数导致的堆栈溢出错误?C++
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 尝试修改 Hbitmap 数据时出现堆栈错误
- 最后一行执行后的堆栈错误
- 如何捕获所有类型的堆栈错误
- 将中缀转换为后缀:无法识别堆栈错误
- 到达主函数结束后发生调试运行时堆栈错误
- 使用链表堆栈错误
- 在c++中计算后缀表达式时接收堆栈错误
- 线程堆栈错误