2010-04-11 13 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()); 
    } 
} 

¿Qué pasa con el código anterior?Uso de la pila definida en C++ stl

error:

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

Respuesta

21

stack::pop es una función que acaba de void descarta el elemento superior de la pila, con el fin de obtener el valor que desea utilizar stack::top.

La razón por la que esto es así es para exception safety reasons (¿qué ocurre si el objeto devuelto arroja una excepción en su constructor de copia?).

+3

Ooh, nunca me di cuenta de que esa era la razón. Siempre pensé que era una limpieza del diseño/separación de las preocupaciones. +1 por iluminarme. :) – jalf

+2

Además, 'pop' tendría que crear una copia para devolverlo. Si el usuario no quiere eso, es probable que termine costando el rendimiento. – Potatoswatter

+3

Según Stroustrup (TC++ PL), la razón real era el rendimiento: si 'pop' devolvía el valor, tendría que crear una copia innecesaria (ya que el valor se destruye consecutivamente en la pila). Sin embargo, ambos suenan plausibles (y ambos se vuelven obsoletos por la semántica del movimiento). –

1

Está tratando pop() que es una operación para imprimir en salida estándar. pop() solo elimina el elemento superior de la pila. Lo más confuso, sin embargo, es , es su salida de depuración.

compilé el fragmento de código con el estándar compilador GNU C++ que me dio:

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

nitpick Menor, el bucle for es en realidad codifican 11 artículos y no 10 como que hacen pensar de una breve vista del recuento de bucles. Considere usar < 11 si se refiere a 11 elementos para agregar.