Ich mache eine sehr einfache Übung auf C++ - Rekursion zum rekursiven Umkehren eines Stapels. Der Code ist unten angehängt. Mein Problem ist, ob ich Referenz T & oder einfach T in meinem rekursiven Aufruf putToBottom verwenden sollte (Stapel &, const T &).C++ Referenz in Rekursion (reverse einen Stapel)
#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;
}
Wenn ich schreibe T temp = myStack.top();
, erhalte ich die richtige Antwort (der Stapel ist jetzt 1 (oben) -> 2 -> 3 -> 4). Wenn ich jedoch T& temp = myStack.top();
oder const T& temp = myStack.top();
schreibe, bekomme ich den falschen (der Stapel wird 4 (oben) -> 4 -> 4 -> 4). Irgendwelche Ideen würden helfen! Vielen Dank!
Wenn Sie 'T &' verwenden, ruft es ein undefiniertes Verhalten auf, weil 'myStack.pop()' die Referenz ungültig macht. Verwenden Sie C++ 11? Wenn dem so ist, dann ist die Bewegungssemantik wahrscheinlich das, was Sie wollen. – Arcinde