📜  C++中Queue和Deque的区别(1)

📅  最后修改于: 2023-12-03 14:39:56.326000             🧑  作者: Mango

C++中Queue和Deque的区别

在 C++ 的标准模板库(STL)中,Queue 和 Deque 是两种非常常用的容器,它们都可以用来实现队列(先进先出)的数据结构。但它们之间还是有一些区别的。

Queue

Queue 是一种基于 Deque 的适配器容器,它是一种先进先出(FIFO)的容器。它的定义如下:

template <class T, class Container = deque<T>> class queue;

Queue 的底层容器可以是任意一种 Sequence 容器,但默认情况下是 Deque。因此,Queue 的所有成员函数都是对底层 Deque 容器的封装,在 Deque 的基础上实现了队列的操作。

基本用法

以下是 Queue 的一些基本操作:

  • push():在 Queue 的末尾添加元素。
  • pop():移除 Queue 的头部元素。
  • front():返回 Queue 头部的元素(但不删除)。
  • back():返回 Queue 末尾的元素(但不删除)。
  • size():返回 Queue 中元素的个数。
  • empty():如果 Queue 为空,返回 true,否则返回 false
优缺点

优点

  • Queue 实现简单,性能较高。
  • Queue 适合在只需要在一端插入、另一端删除的场景中使用。

缺点

  • Queue 不适合在中间插入或删除元素。
Deque

Deque 是一种双端队列容器,它支持在头和尾部插入和删除元素,类似于一个向两个方向扩展的 Vector。它的定义如下:

template <class T, class Allocator = allocator<T>> class deque;

Deque 的底层数据结构是一个环形的缓冲区,这个缓冲区又由多个页(一般是每页512 bytes大小)组成,每一页也相当于一个vector容器,deque本身只是维护了一个缓冲区描述的一个头部和尾部位置而已。

基本用法

以下是 Deque 的一些基本操作:

  • push_front():在 Deque 的头部插入元素。
  • push_back():在 Deque 的尾部插入元素。
  • pop_front():移除 Deque 的头部元素。
  • pop_back():移除 Deque 的尾部元素。
  • front():返回 Deque 头部的元素(但不删除)。
  • back():返回 Deque 末尾的元素(但不删除)。
  • size():返回 Deque 中元素的个数。
  • empty():如果 Deque 为空,返回 true,否则返回 false
优缺点

优点

  • Deque 可以在容器的头部和尾部进行常数时间(O(1))的插入和删除操作。
  • Deque 支持随机访问,可以通过下标([])来访问元素。

缺点

  • Deque 相对于 Vector 等容器,空间占用率更高,因为 deque 一般采用的是块存储方式,每个块中除了包含元素外,还有控制信息(如前向指针、后向指针等)。
  • 当 Deque 中元素数量较少时,它的性能可能不如其他容器。但当它处理大量元素时,它提供了同时处理头部和尾部的最佳性能。
总结

Queue 适合在只需要在一端插入、另一端删除的场景中使用,而 Deque 则适合需要在头尾插入和删除元素的场景中使用。无论使用哪种容器,都可以使用 STL 提供的常用函数(如 size()empty() 等)来访问和操作容器中的元素。