2009-02-08 4 views

Répondre

34

La pile n'a pas d'itérateurs, par définition de pile. Si vous avez besoin d'une pile avec des itérateurs, vous devrez l'implémenter vous-même au-dessus d'un autre conteneur (std :: list, std :: vector, etc.). Stack doc is here.

P.S. D'après un commentaire d'Iraimbilanja, std :: stack utilise par défaut std :: deque pour l'implémentation.

+2

+1. notez aussi que std :: stack utilise par défaut std :: deque comme son implémentation, ce qui pourrait être un bon choix pour l'implémentation par défaut d'un iterstack. Une autre question est, * pourquoi * voulez-vous une pile iterable et non, disons, une deque rectiligne –

+0

10x, je ne savais pas que – Drakosha

1

Dans les documentations SGI,et GNU, stack ne fournit pas d'itérateur.

10

Si vous avez besoin d'une pile avec des itérateurs, vous avez deux choix. std :: vector en utilisant push_back(), pop_back(). std :: deque avec soit push_back()/pop_back() ou push_front()/pop_front().

0

Le std::stack expose son conteneur sous-jacent (et donc ses itérateurs) à sous-classes via son interface protégée. Donc, si vous voulez y accéder, vous pouvez étendre un peu le 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'; 
} 

sortie:

2 5 3 7 9 
Questions connexes