Est-ce que la pile dans le STL C++ expose les itérateurs du conteneur sous-jacent ou devrais-je utiliser ce conteneur directement?Est-ce que std :: stack expose des itérateurs?
29
A
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.
1
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
+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 –
10x, je ne savais pas que – Drakosha