队列优于循环队列的任何用例?

时间:2016-11-01 04:11:32

标签: data-structures queue

循环队列显然更好,因为它帮助我们通过弹出元素来使用剩下的空白区域。它还节省了每次弹出后用于横向移动元素的时间。

但是,是否有任何用例比使用循环队列更喜欢队列?

Queue的定义=我们将使用线性数组实现。遵循FIFO并且没有覆盖

循环队列的定义=环形缓冲区的实现。跟随FIFO。没有覆盖。

1 个答案:

答案 0 :(得分:3)

注意:在许多语言中,queue只是一个界面,并没有说明实施的任何内容。

使用基于阵列的循环队列,即a.k.a环形缓冲区时,必须处理推送到完整缓冲区的情况。你可以:

  1. 忽略插入
  2. 覆盖最旧的条目
  3. 再次阻止,直到
  4. (重新)分配内存并复制所有内容
  5. 使用超大缓冲区,以免这种情况发生
  6. 这些选项中的每一个都有缺点。如果你能和他们住在一起,或者你知道你永远不会填充缓冲区,那么环形缓冲区就是你的选择。

    选项3& 4会诱发口吃。根据您的使用情况,您可能更喜欢更长但稳定的访问时间和可靠性而非偶尔出现峰值因此选择linked list或其他某种动态实施,而不是deque

    示例用例是任务,您必须获得稳定的帧/采样率或吞吐量,并且您不能容忍口吃,例如:

    • 实时视频和音频处理
    • 实时渲染
    • 网络
    • 线程池,当你不希望线程在推送新工作时阻塞太长时间。

    但是,基于线性阵列的队列将遭受相同的缺点。我没有看到在循环队列中选择线性队列的原因。
    (除了略高的实现复杂性。)

    默认情况下,C ++中的

    std::queue使用deque作为底层容器。 deque本质上是一个动态的数组数组,它​​似乎是大多数用例的良好基础,因为它以小块分配内存,因此导致较少的卡顿。