2009-02-08 11 views

Respuesta

34

La pila no tiene iteradores, por definición de pila. Si necesita apilar con iteradores, tendrá que implementarlo usted mismo encima de otro contenedor (std :: list, std :: vector, etc.). Stack doc is here.

P.S. De acuerdo con un comentario que recibí de Iraimbilanja, std :: stack utiliza por defecto std :: deque para su implementación.

+2

+1. tenga en cuenta también que std :: stack usa de manera predeterminada std :: deque como su implementación, por lo que esta podría ser una buena opción para la implementación predeterminada de un iterstack también. Otra pregunta es, * por qué * quieres una pila iterable y no, por ejemplo, una deque –

+0

10x, no sabía que – Drakosha

1

En SGI, MSDN y GNU documentaciones, stack no proporciona un iterador.

10

Si necesita una pila con iteradores, tiene dos opciones. std :: vector usando push_back(), pop_back(). std :: deque con push_back()/pop_back() o push_front()/pop_front().

0

std::stack expone su contenedor subyacente (y por lo tanto iteradores) a subclases a través de su interfaz protegida. Entonces, si desea acceder a ellos, puede ampliar un poco el std::stack.

template<typename T, typename Container = std::deque<T>> 
class iterable_stack 
: public std::stack<T, Container> 
{ 
    using std::stack<T, Container>::c; 

public: 

    // expose just the iterators of the underlying container 
    auto begin() { return std::begin(c); } 
    auto end() { return std::end(c); } 

    auto begin() const { return std::begin(c); } 
    auto end() const { return std::end(c); } 
}; 

int main() 
{ 
    iterable_stack<int> st; 

    st.push(2); 
    st.push(5); 
    st.push(3); 
    st.push(7); 
    st.push(9); 

    for(auto i: st) 
     std::cout << i << ' '; 
    std::cout << '\n'; 
} 

Salida:

2 5 3 7 9 
Cuestiones relacionadas