循环队列显然更好,因为它帮助我们通过弹出元素来使用剩下的空白区域。它还节省了每次弹出后用于横向移动元素的时间。
但是,是否有任何用例比使用循环队列更喜欢队列?
Queue的定义=我们将使用线性数组实现。遵循FIFO并且没有覆盖
循环队列的定义=环形缓冲区的实现。跟随FIFO。没有覆盖。
答案 0 :(得分:3)
注意:在许多语言中,queue
只是一个界面,并没有说明实施的任何内容。
使用基于阵列的循环队列,即a.k.a环形缓冲区时,必须处理推送到完整缓冲区的情况。你可以:
这些选项中的每一个都有缺点。如果你能和他们住在一起,或者你知道你永远不会填充缓冲区,那么环形缓冲区就是你的选择。
选项3& 4会诱发口吃。根据您的使用情况,您可能更喜欢更长但稳定的访问时间和可靠性而非偶尔出现峰值因此选择linked list
或其他某种动态实施,而不是deque
。
示例用例是任务,您必须获得稳定的帧/采样率或吞吐量,并且您不能容忍口吃,例如:
但是,基于线性阵列的队列将遭受相同的缺点。我没有看到在循环队列中选择线性队列的原因。
(除了略高的实现复杂性。)
std::queue
使用deque
作为底层容器。 deque
本质上是一个动态的数组数组,它似乎是大多数用例的良好基础,因为它以小块分配内存,因此导致较少的卡顿。