VecDeque环缓冲区如何在内部工作?

时间:2018-03-02 15:42:52

标签: collections rust queue

VecDeque documentation表示它使用可扩展的环形缓冲区作为实现。

内部如何运作?

  • 如果我只将它用作队列(仅push_backpop_front),那么移动何时完成?每次我拨打pop_front?当内部缓冲区达到临界尺寸时?
  • 为什么有两个切片(一个用于背面,一个用于正面)?它们不是连续的吗?

1 个答案:

答案 0 :(得分:7)

<强> TL; DR:

  • &#34; shift&#34;填充缓冲区并且头部不在其末尾时完成。如果每次推送都弹出,则无需移动数据。
  • 值不是连续的,因为它们环绕缓冲区。

VecDeque有2个内部索引:一个用于头部,一个用于尾部。当您向{/ 1}}推送或弹出内容时,头部或尾部会相应地递增/递减。

第一种情况:缓冲区未满

让我们看看有VecDequepush_back的电话会发生什么。

头部不在缓冲区的最后一个索引

pop_front

头到达缓冲区中的最后一个索引

你只需将缓冲区包裹起来。缓冲区现在分为两部分。

        T       H
Before [o o o o . . . . ]
          T       H
After  [. o o o o . . . ]

第二种情况:缓冲区已满

当填充内部缓冲区并推送另一个内容时,您有三个方案in the code

头部位于缓冲区的末尾

缓冲区只会增长。

        H       T
Before [. . . . o o o o ]
          H       T
After  [o . . . . o o o ]

头部短于尾部

缓冲区增长后,头部在尾部后移动。

        T             H
Before [o o o o o o o . ]
        T             H
After  [o o o o o o o . . . . . . . . . ]

尾巴比头部短

缓冲区增长后,尾部移动到缓冲区的末尾。

            H T
Before [o o . o o o o o ]
              T             H
After  [. . . o o o o o o o . . . . . . ]