【问题标题】:c++ deque vs queue vs stackc++ deque vs queue vs stack
【发布时间】:2011-01-15 22:05:16
【问题描述】:

Queue 和 Stack 是一种被广泛提及的结构。但是,在 C++ 中,对于队列,您可以通过两种方式进行:

#include <queue>
#include <deque>

但是对于堆栈你只能这样做

#include <stack>

我的问题是,队列和双端队列有什么区别,为什么要提出两种结构?对于堆栈,可以包含任何其他结构吗?

【问题讨论】:

    标签: c++ containers


    【解决方案1】:

    Moron/Aryabhatta 是正确的,但更多细节可能会有所帮助。

    队列和堆栈是比双端队列、向量或列表更高级别的容器。我的意思是,您可以从较低级别的容器中构建队列或堆栈。

    例如:

      std::stack<int, std::deque<int> > s;
      std::queue<double, std::list<double> > q;
    

    将使用双端队列作为底层容器构建一个整数堆栈,并使用列表作为底层容器构建一个双精度队列。

    您可以将s 视为受限双端队列,将q 视为受限列表。

    所有需要的是低层容器实现高层容器所需的方法。这些是 back()push_back()pop_back() 用于堆栈,front()back()push_back()pop_front() 用于队列。

    请参阅stackqueue 了解更多详情。

    关于双端队列,它不仅仅是一个可以在两端插入的队列。特别是,它具有随机访问operator[]。这使它更像是一个向量,而是一个可以在开头插入和删除push_front()pop_front() 的向量。

    详情请参阅deque

    【讨论】:

    • stackqueue 只是限制 deque 的完整功能集。
    【解决方案2】:

    Queue: 只能在一端插入,从另一端取出。

    Deque:可以从两端插入和移除。

    因此,使用Deque,您可以对QueueStack 建模。

    提示:
    Deque 是“Double ended queue”的缩写。

    【讨论】:

    • 如果使用 Deque 对堆栈进行建模,会不会太过分了?
    • 你不能用队列为堆栈建模。
    • 还有很多不同之处。 queue 不满足容器的要求。看在上帝的份上,它没有迭代器!
    • @skydoor 在所有标准库容器中,双端队列可以说是开销最低的一个。
    • @skydoor:仅供参考,STL 的std::stack 默认使用std::deque 作为后备容器。我在这里推测原因:stackoverflow.com/questions/102459/…(基本上,增长deque 开销很低)。
    【解决方案3】:

    deque 是一个容器模板。它满足带有随机访问迭代器的序列的要求,很像vector

    queue 根本不是一个容器,它是一个适配器。它包含一个容器并提供一个不同的、更具体的接口。当您想记住(或提醒)时使用queue 以避免除push[_back]pop[_front]frontbacksizeempty 之外的操作。除了第一个和最后一个之外,您根本无法查看queue 中的元素!

    【讨论】:

    • 适配器——换句话说不必要的功能残缺,但是适配器很好
    【解决方案4】:

    在 C++ 库中,std::stackstd::queue 都实现为容器适配器。这意味着它们分别提供了堆栈或队列的接口,但它们本身都不是真正的容器。相反,他们使用一些其他容器(例如std::dequestd::list 来实际存储数据),而std::stack 类只有一小段代码可以将pushpop 转换为push_backpop_back(和std::queue 大致相同,但使用push_backpop_front)。

    【讨论】:

    • 对于queue,VS 似乎也将pop 映射到pop_front,并将push 映射到push_back,所以我猜这取决于实现。
    • @chappjc:不--重新检查,只是我的记忆消失了。 pop_frontpush_back 是必需的。我很抱歉。
    【解决方案5】:

    双端队列是一个双端队列,允许从任一端轻松插入/删除。队列只允许在一端插入并从另一端检索。

    【讨论】:

      【解决方案6】:

      deque 支持前后插入/弹出

      queue 只支持插入到后面,从前面弹出。你知道,一个 FIFO(先进先出)。

      【讨论】:

        【解决方案7】:

        双端队列是双端的。队列不是。

        【讨论】:

        • 解释栈的实现,比如它是如何添加到队列和双端队列(deque)中的。
        【解决方案8】:

        优先队列出队是根据一些排序(优先级)比较而不是入队顺序发生的。

        例如,您可以将定时事件存储在一个您希望首先提取最快事件并查询其预定时间的位置,以便您可以一直睡到那个时间点。

        优先级队列通常使用堆来实现。

        这里是 Mike Anderson:
        https://www.quora.com/What-is-the-difference-between-a-priority-queue-and-a-queue

        【讨论】:

          【解决方案9】:

          在deque(双端队列)中,元素可以从后面插入,也可以从后面移除(和栈一样),但是队列只允许从前面移除。

          【讨论】:

          • 这个答案并没有为主题添加任何新内容(大多数答案来自 2010 年)
          猜你喜欢
          • 2012-08-07
          • 2012-11-17
          • 1970-01-01
          • 1970-01-01
          • 2015-01-15
          • 1970-01-01
          • 2013-01-23
          • 2011-07-07
          相关资源
          最近更新 更多