2009-02-08 51 views

回答

34

根据堆栈的定义,堆栈没有迭代器。如果你需要迭代器堆栈,你需要自己在其他容器(std :: list,std :: vector等)之上实现它。 Stack doc is here

P.S.根据我从Iraimbilanja得到的评论,std :: stack默认使用std :: deque来实现。

+2

1。还要注意std :: stack默认使用std :: deque作为它的实现,所以这对于iterstack的默认实现也是一个不错的选择。另一个问题是,*为什么*你想要一个可迭代的堆栈,而不是,比如说,一个直接的双层队列 – 2009-02-08 08:18:09

1

SGI,MSDNGNU文档中,stack不提供迭代器。

10

如果您需要使用迭代器的堆栈,您有两种选择。 std :: vector使用push_back(),pop_back()。 std :: deque与push_back()/ pop_back()或push_front()/ pop_front()。

0

std::stack确实通过其受保护的接口将其底层容器(因此迭代器)公开到的子类。所以如果你想访问它们,你可以稍微扩展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'; 
} 

输出:

2 5 3 7 9