3

std::queue默认情况下使用双端队列实现。std::deque具有下标运算符 ,operator[]并且可能用数组实现。那么为什么没有std::queueoperator[]

我意识到你可以有一个带有列表的队列作为底层容器。( std::queue<int, std::list<int>>.) 但即使这会使下标运算符变慢,这真的是不包括它的好理由吗?这是我能想到的不包括在内的唯一原因。

4

4 回答 4

8

因为队列的定义不支持这样的接口。队列是一种先进先出的数据结构,即先进先出。队列支持入队出队 操作。

将队列想象成管道:您将数据插入一端,然后从另一端取出 - 一个接一个。插入数据称为入队,取出数据称为出队。C++ 标准库std::queue定义了这两个操作:push()是入队操作的名称,而出队操作已分为两个步骤front(),即pop(). dequeue 分为两个步骤的基本原理是提供强大的异常保证1

维基百科简要解释了这一点,

队列是一种特定类型的集合,其中集合中的实体保持有序,并且对集合的主要(或唯一)操作是将实体添加到后端终端位置以及从前端终端位置移除实体。这使得队列成为先进先出 (FIFO) 数据结构。在 FIFO 数据结构中,添加到队列中的第一个元素将是第一个被删除的元素。这相当于一旦添加了一个元素,必须先删除之前添加的所有元素,然后才能调用新元素。队列是线性数据结构的一个例子。

1、如果你想知道它给出的强异常保证有多准确,那么你可以开始另一个话题,因为它很长,需要很大的耐心才能正确理解。为此,我建议您阅读 Herb Sutter 撰写的 Exceptional C++。

于 2011-08-31T19:05:31.147 回答
4

这是一个概念问题。在队列中,您添加到后面并从前面而不是从中间取

于 2011-08-31T19:08:42.727 回答
3

之所以不包含它,是因为队列是一种具有入队和出队操作的数据结构,而不是随机访问。std::queue存在是为了将现有容器适配成队列接口,所以只提供队列接口。

于 2011-08-31T19:07:26.230 回答
1

如果您想使用 [] 则使用带有 push_front 和 back/pop_back 的双端队列,而不是队列。

为什么双端队列有它但没有队列对我来说也没有意义。

于 2015-02-06T18:08:08.113 回答