c ++ deque vs queue vs stack

sky*_*oor 73 c++ containers

队列和堆栈是广泛提到的结构.但是,在C++中,对于队列,您可以通过两种方式完成:

#include <queue>
#include <deque>
Run Code Online (Sandbox Code Playgroud)

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

#include <stack>
Run Code Online (Sandbox Code Playgroud)

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

And*_*ein 68

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

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

例如:

  std::stack<int, std::deque<int> > s;
  std::queue<double, std::list<double> > q;
Run Code Online (Sandbox Code Playgroud)

将使用deque作为底层容器和使用列表作为底层容器的双精度队列来构建一堆int.

您可以将其s视为受限制的双端队列和q限制列表.

所有必要的是低级容器实现更高级容器所需的方法.这些back(),push_back()pop_back()堆栈和front(),back(),push_back(),和pop_front()队列.

有关详细信息,请参阅堆栈队列.

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

详见deque.

  • `stack`和`queue` ___just restrict___`deque`来自其完整的功能集. (11认同)

小智 42

Queue:您只能在一端插入并从另一端移除.

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

所以使用a Deque,你可以模拟a Queue和a Stack.

提示:
Deque是短期的" d ouble ê nded UE".

  • 如果使用Deque来建模堆栈,它会不会过度杀伤? (4认同)
  • @skydoor:就像FYI一样,STL的`std :: stack`默认使用`std :: deque`作为后备容器.我推测这里的原因:http://stackoverflow.com/questions/102459/why-does-stdstack-use-stddeque-by-default/102529#102529(基本上,增长一个`deque`是低开销). (3认同)

Pot*_*ter 32

deque是一个容器模板.它满足了具有随机访问迭代器的序列的要求,就像a vector.

queue它根本不是容器,它是一个适配器.它包含一个容器,并提供不同的,更具体的界面.使用queue时,你要记住(或提醒),以避免操作之外push[_back]pop[_front],frontback,sizeempty.你根本不能看到queue第一个和最后一个内部的元素!

  • 适配器 - 换句话说_unnecessary功能crippler_,但适配器就好了 (6认同)

Jer*_*fin 21

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


Mic*_*ner 6

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


rmn*_*rmn 5

deque 支持前后插入/弹出

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