std :: stack是否公开了迭代器?

mdm*_*mdm 34 c++ stack stl

std::stackC++ STL中是否公开了底层容器的任何迭代器,还是应该直接使用该容器?

Dra*_*sha 37

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

PS根据我从Iraimbilanja得到的评论,std :: stack默认使用std :: deque进行实现.

  • +1.另请注意,std :: stack默认使用std :: deque作为其实现,因此对于iterstack的默认实现来说这可能是一个不错的选择.另一个问题是,*为什么*你想要一个可迭代的堆栈,而不是一个直接的双端队列 (3认同)

pax*_*977 12

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


Gal*_*lik 6

std::stack不暴露其底层容器(因此迭代),以亚类通过其保护的接口。所述std::stack的底层容器对象对应于(被保护)的数据成员c。所以如果你想访问它们,你可以扩展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';
}
Run Code Online (Sandbox Code Playgroud)

输出:

2 5 3 7 9 
Run Code Online (Sandbox Code Playgroud)