是否有标准库函数可以反转STL堆栈?

时间:2014-07-15 21:00:02

标签: c++ stl

反过来我的意思是交换元素的顺序,这样包含ABCD的堆栈就会以DCBA结束。我目前正在使用向量而不是堆栈,因为反向操作。

3 个答案:

答案 0 :(得分:3)

std::stack<T>通过包装底层容器来运行,通常是std::deque<T>

// According to cppreference.com
template<
    class T,
    class Container = std::deque<T>
> class stack;

没有理由使用std::stack代替std::vectorstd::deque,除非您关心的是最重要的元素。该结构甚至不会暴露迭代器,也是设计的一部分。

当然你可以编写一个奇特的功能来反转它(存储顶部,弹出,推送到一个新的堆栈,重复),但为什么要做比你更多的工作呢?

答案 1 :(得分:3)

堆栈是一个容器,它提供了一个漂亮的简单push / pop / top接口。您要求的实际上不是堆栈功能,因此意味着堆栈是满足您需求的错误容器。

最有可能vectordeque是一个不错的选择(正如您在问题中已经提到的那样),因为它们提供恒定的时间推/回弹功能,以及线性时间逆转(std::reverse)。

答案 2 :(得分:3)

STL堆栈不是容器,它是容器适配器(http://www.cplusplus.com/reference/stack/stack/)。底层容器类型作为参数传递给模板,默认为deque。对你的问题的简短回答是'不' - 堆栈接口不提供这种能力。

我看到的两个选项是:

  1. 如上所述使用堆栈接口(纯堆栈解决方案)(为方便起见,此处重复链接): http://dev-faqs.blogspot.com/2012/02/reverse-given-stack-in-place.html

  2. 使用更灵活的结构(例如vector或deque)。在这种情况下,根据您是在“前进”还是“后退”模式下使用序列,从任何一端使用双端队列和推/弹都可能是最有意义的。这是最有效的。