c ++ deque vs queue vs stack

时间:2010-02-11 21:51:06

标签: c++ containers

队列和堆栈是一个广泛提到的结构。但是,在C ++中,对于队列,您可以通过两种方式执行此操作:

#include <queue>
#include <deque>

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

#include <stack>

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

9 个答案:

答案 0 :(得分:60)

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

队列和堆栈是比deque,vector或list更高级别的容器。通过这个,我的意思是你可以从较低级别的容器中构建一个队列或堆栈。

例如:

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

使用deque作为底层容器和使用list作为底层容器的双精度队列构建一堆int。

您可以将s视为受限制的双端空格,将q视为限制列表。

所有必要的是低级容器实现更高级容器所需的方法。对于堆栈,这些是back()push_back()pop_back(),对于队列,front()back()push_back()pop_front()都是operator[]

有关详细信息,请参阅stackqueue

关于双端队列,它不仅仅是一个可以在两端插入的队列。特别是,它具有随机访问push_front()。这使它更像是一个向量,而是一个向量,您可以在其中插入和删除pop_front()和{{1}}。

有关详细信息,请参阅deque

答案 1 :(得分:37)

Queue:您只能在一端插入并从另一端删除。

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

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

提示:
Deque是“ D ouble e nded que ue”的缩写。

答案 2 :(得分:30)

deque是一个容器模板。它满足具有随机访问迭代器的序列的要求,非常类似于vector

queue根本不是容器,它是适配器。它包含一个容器,并提供不同的,更具体的界面。如果您想要记住(或提醒)以避免除queuepush[_back]pop[_front]frontback以及{之外的操作,请使用size {1}}。除了第一个和最后一个之外,您无法查看empty内的元素!

答案 3 :(得分:20)

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

答案 4 :(得分:5)

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

答案 5 :(得分:4)

deque支持后面插入/弹出&amp;前

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

答案 6 :(得分:0)

deque是双头的。队列不是。

答案 7 :(得分:0)

  

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

     

例如,您可以将定时事件存储在您想要首先提取最快事件并查询其预定时间的事件中,以便您可以睡到该时间点。

     

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

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

答案 8 :(得分:0)

在双端队列(双端队列)中,该元素可以从后面插入并从表单中删除(与堆栈相同),但在队列中只能从前面删除。