【发布时间】:2011-01-15 22:05:16
【问题描述】:
Queue 和 Stack 是一种被广泛提及的结构。但是,在 C++ 中,对于队列,您可以通过两种方式进行:
#include <queue>
#include <deque>
但是对于堆栈你只能这样做
#include <stack>
我的问题是,队列和双端队列有什么区别,为什么要提出两种结构?对于堆栈,可以包含任何其他结构吗?
【问题讨论】:
标签: c++ containers
Queue 和 Stack 是一种被广泛提及的结构。但是,在 C++ 中,对于队列,您可以通过两种方式进行:
#include <queue>
#include <deque>
但是对于堆栈你只能这样做
#include <stack>
我的问题是,队列和双端队列有什么区别,为什么要提出两种结构?对于堆栈,可以包含任何其他结构吗?
【问题讨论】:
标签: c++ containers
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() 用于队列。
关于双端队列,它不仅仅是一个可以在两端插入的队列。特别是,它具有随机访问operator[]。这使它更像是一个向量,而是一个可以在开头插入和删除push_front() 和pop_front() 的向量。
详情请参阅deque。
【讨论】:
stack 和 queue 只是限制 deque 的完整功能集。
Queue: 只能在一端插入,从另一端取出。
Deque:可以从两端插入和移除。
因此,使用Deque,您可以对Queue 和Stack 建模。
提示:Deque 是“Double ended queue”的缩写。
【讨论】:
queue 不满足容器的要求。看在上帝的份上,它没有迭代器!
std::stack 默认使用std::deque 作为后备容器。我在这里推测原因:stackoverflow.com/questions/102459/…(基本上,增长deque 开销很低)。
deque 是一个容器模板。它满足带有随机访问迭代器的序列的要求,很像vector。
queue 根本不是一个容器,它是一个适配器。它包含一个容器并提供一个不同的、更具体的接口。当您想记住(或提醒)时使用queue 以避免除push[_back] 和pop[_front]、front 和back、size 和empty 之外的操作。除了第一个和最后一个之外,您根本无法查看queue 中的元素!
【讨论】:
在 C++ 库中,std::stack 和 std::queue 都实现为容器适配器。这意味着它们分别提供了堆栈或队列的接口,但它们本身都不是真正的容器。相反,他们使用一些其他容器(例如std::deque 或std::list 来实际存储数据),而std::stack 类只有一小段代码可以将push 和pop 转换为push_back 和pop_back(和std::queue 大致相同,但使用push_back 和pop_front)。
【讨论】:
queue,VS 似乎也将pop 映射到pop_front,并将push 映射到push_back,所以我猜这取决于实现。
pop_front 和 push_back 是必需的。我很抱歉。
双端队列是一个双端队列,允许从任一端轻松插入/删除。队列只允许在一端插入并从另一端检索。
【讨论】:
deque 支持前后插入/弹出
queue 只支持插入到后面,从前面弹出。你知道,一个 FIFO(先进先出)。
【讨论】:
双端队列是双端的。队列不是。
【讨论】:
优先队列出队是根据一些排序(优先级)比较而不是入队顺序发生的。
例如,您可以将定时事件存储在一个您希望首先提取最快事件并查询其预定时间的位置,以便您可以一直睡到那个时间点。
优先级队列通常使用堆来实现。
这里是 Mike Anderson:
https://www.quora.com/What-is-the-difference-between-a-priority-queue-and-a-queue
【讨论】:
在deque(双端队列)中,元素可以从后面插入,也可以从后面移除(和栈一样),但是队列只允许从前面移除。
【讨论】: