2010-04-11 11 views
5
#include <stack> 
using namespace std; 

int main() { 
    stack<int> s; 
    int i; 
    for (i = 0; i <= 10; i++) { 
     s.push(i); 
    } 
    for (i = 0; i <= 10; i++) { 
     printf("%d", s.pop()); 
    } 
} 

Was ist falsch mit dem Code oben?Verwendung von Stack definiert in C++ stl

Fehler:

In function int main() : aggregate value used where an integer was expected

Antwort

21

stack::pop ist eine void Funktion, die nur das oberste Element auf dem Stapel verwirft, um den Wert, den Sie verwenden möchten stack::top zu bekommen.

Der Grund dafür ist für exception safety reasons (was passiert, wenn das zurückgegebene Objekt eine Exception in seinem Kopierkonstruktor auslöst?).

+3

Ooh, nie realisiert, dass das der Grund war. Ich dachte immer nur, es sei eine Sauberkeit der Gestaltung/Trennung von Anliegen. +1, um mich zu erleuchten. :) – jalf

+2

Außerdem müsste 'pop' eine Kopie erstellen, um sie zurückzugeben. Wenn der Benutzer das nicht möchte, wird es wahrscheinlich die Performance kosten. – Potatoswatter

+3

Laut Stroustrup (TC++ PL) war der eigentliche Grund die Performance: Wenn 'pop' den Wert zurückgab, musste eine unnötige Kopie erstellt werden (da der Wert im Stack fortlaufend zerstört wurde). Beide klingen jedoch plausibel (und beide werden durch die Bewegungssemantik überflüssig gemacht). –

1

Sie behandeln pop(), was eine Operation ist, die auf die Standardausgabe gedruckt wird. pop() entfernt nur das oberste Element aus dem Stapel. Die verwirrendste Sache jedoch ist Ihre Debug-Ausgabe.

ich Ihr Code-Fragment mit dem Standard-GNU C++ Compiler zusammengestellt, die mir gegeben haben:

main.cpp|12|error: invalid use of void expression

int main() { 
    stack<int> s; 
    int i; 
    for (i = 0; i <= 10; i++) { 
     s.push(i); 
    } 
    for (i = 0; i <= 10; i++) { 
      printf("%i", s.top()); 
      s.pop(); 
    } 
} 
2

Minor nitpick, Ihre for-Schleife tatsächlich 11 Artikel kodieren und nicht 10, wie Sie von einem denken kurzer Blick auf die Anzahl der Schleifen. Erwägen Sie die Verwendung von < 11, wenn Sie 11 Elemente zum Hinzufügen meinen.