2017-04-11 2 views
0

Ich habe diese umgekehrte Methode auf meinem Stapel, die die Elemente innerhalb des Stapels zu einem tmpStack umkehrt. Ich möchte wissen, wie tmpStack meinem ursprünglichen Stack zugewiesen wird. Ich habe keine Möglichkeit gefunden, meinen Originalstapel diesem Wert zuzuweisen, damit er angezeigt wird, wenn ich Druck verwende und nicht nur tmpStack drucke. Mein Problem ist in den letzten Zeilen.Reverse-Stack-Elemente C++

template<class T> 
void stack<T>::reverse(){ 

    T item; 
    stack<T> tmpStack; 

    while (empty() == false) 
    { 
     item = stack<T>::pop(); 
     tmpStack.push(item); 
    } 


    stack<T> = tmpStack; 


} 
+0

Warum kehren Sie die * Elemente des aktuellen Stapels nicht um? So etwas wie: 'für (int i = 0; i

Antwort

0

Unter der Annahme, dass Ihr operator= richtig funktioniert:

*this = tmpStack; 

Edit:

Als Toby richtig angedeutet: Da C++ 11, der bessere Weg ist

*this = std::move(tmpStack); 

Der Unterschied: in Ihrem konkreten Fall, n eine, da Sie keinen Zuweisungsoperator zur Verfügung stellen. Aber wenn Sie das tun, würde der letztere stattdessen aufgerufen werden.

Stack& operator=(Stack&& other) 
{ 
    // You do not copy the data any more here, but SWAP! 
    // Swapping assures that, if *this has data allocated 
    // other will clean it up correctly for you. 
} 

Mit einer solchen Zuweisungsoperator (und einem appopriate bewegen Konstruktor, Stichwort rule of five), erhalten Sie effizienteren Code, wie Sie einen Schritt der Datenzuordnung und Zerstörung speichern (statt Kopie bewegen).

+0

Perfekt danke! –

+1

Wenn Sie einen funktionierenden move-assignment-Operator hatten, wäre '* this = std :: move (tmpStack)' normalerweise vorzuziehen. –