std::queue
默认情况下使用双端队列实现。std::deque
具有下标运算符 ,operator[]
并且可能用数组实现。那么为什么没有std::queue
呢operator[]
?
我意识到你可以有一个带有列表的队列作为底层容器。( std::queue<int, std::list<int>>
.) 但即使这会使下标运算符变慢,这真的是不包括它的好理由吗?这是我能想到的不包括在内的唯一原因。
std::queue
默认情况下使用双端队列实现。std::deque
具有下标运算符 ,operator[]
并且可能用数组实现。那么为什么没有std::queue
呢operator[]
?
我意识到你可以有一个带有列表的队列作为底层容器。( std::queue<int, std::list<int>>
.) 但即使这会使下标运算符变慢,这真的是不包括它的好理由吗?这是我能想到的不包括在内的唯一原因。
因为队列的定义不支持这样的接口。队列是一种先进先出的数据结构,即先进先出。队列支持入队和出队 操作。
将队列想象成管道:您将数据插入一端,然后从另一端取出 - 一个接一个。插入数据称为入队,取出数据称为出队。C++ 标准库std::queue
定义了这两个操作:push()
是入队操作的名称,而出队操作已分为两个步骤front()
,即pop()
. dequeue 分为两个步骤的基本原理是提供强大的异常保证1。
维基百科简要解释了这一点,
队列是一种特定类型的集合,其中集合中的实体保持有序,并且对集合的主要(或唯一)操作是将实体添加到后端终端位置以及从前端终端位置移除实体。这使得队列成为先进先出 (FIFO) 数据结构。在 FIFO 数据结构中,添加到队列中的第一个元素将是第一个被删除的元素。这相当于一旦添加了一个元素,必须先删除之前添加的所有元素,然后才能调用新元素。队列是线性数据结构的一个例子。
1、如果你想知道它给出的强异常保证有多准确,那么你可以开始另一个话题,因为它很长,需要很大的耐心才能正确理解。为此,我建议您阅读 Herb Sutter 撰写的 Exceptional C++。
这是一个概念问题。在队列中,您添加到后面并从前面而不是从中间取
之所以不包含它,是因为队列是一种具有入队和出队操作的数据结构,而不是随机访问。std::queue
存在是为了将现有容器适配成队列接口,所以只提供队列接口。
如果您想使用 [] 则使用带有 push_front 和 back/pop_back 的双端队列,而不是队列。
为什么双端队列有它但没有队列对我来说也没有意义。