为什么std :: queue没有operator []?

时间:2011-08-31 19:03:22

标签: c++ queue subscript-operator

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

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

4 个答案:

答案 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的双端队列而不是队列。

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