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