我正在做一个非常简单的C ++递归练习,用于递归地反转堆栈。代码附在下面。我的问题是我是否应该使用参考T&或者在我的递归调用putToBottom(stack&,const T&)中简单地使用T.。
#include <iostream>
#include <stack>
using namespace std;
template <typename T>
void putToBottom(stack<T>& myStack, const T& topOne)
{
if (myStack.empty())
{
myStack.push(topOne);
return;
}
//Should I use T& or T here???
***T temp = myStack.top();***
myStack.pop();
putToBottom(myStack, topOne);
myStack.push(temp);
}
template <typename T>
void reverseStack(stack<T>& myStack)
{
if (myStack.empty()) return;
T& topOne = myStack.top();
myStack.pop();
reverseStack(myStack);
putToBottom(myStack, topOne);
}
int main()
{
stack<int> myStack;
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
reverseStack(myStack);
while (!myStack.empty())
{
cout << myStack.top() << "\n";
myStack.pop();
}
cout << endl;
return 0;
}
如果我写T temp = myStack.top();
,我会得到正确的答案(堆栈现在是1(顶部) - &gt; 2 - &gt; 3 - &gt; 4)。但是,如果我写T& temp = myStack.top();
或const T& temp = myStack.top();
,我得错了(堆栈变为4(顶部) - > 4 - > 4 - > 4)。任何想法都会有帮助!谢谢!
答案 0 :(得分:0)
如果您使用T& temp = myStack.top()
,那么一旦执行myStack.pop()
,temp
将成为悬空参考,并且进一步使用它是未定义的行为。
如果您使用的是C ++ 11,那么您可能需要移动语义:
T temp = std::move(myStack.top());
myStack.pop();
putToBottom(myStack, topOne);
myStack.push(std::move(temp));
同样在reverseStack
。
虽然我必须注意,这是一种特别低效的反转堆栈的方法。更好的方法是将原始堆栈中的所有内容弹出,然后将其推入第二个堆栈。