collections - VecDeque 环形缓冲区在内部是如何工作的?

标签 collections rust queue

VecDeque documentation说它使用可增长的环形缓冲区作为实现。

它在内部是如何工作的?

  • 在我只将它用作队列的情况下(仅 push_backpop_front),移位何时完成?每次调用pop_front?当内部缓冲区达到临界大小时?
  • 为什么有两片(一张在背面,一张在正面)?它们不是连续的吗?

最佳答案

长话短说:

  • “移位”在缓冲区已填满且头部不在缓冲区末尾时完成。如果每次推送时都弹出,则无需移动数据。
  • 值不连续,因为它们环绕缓冲区。

VecDeque 有 2 个内部索引:一个用于头部,一个用于尾部。当您将内容插入或弹出 VecDeque 时,头部或尾部会相应地递增/递减。

第一种情况:缓冲区未满

让我们看看在一次调用 push_backpop_front 时会发生什么。

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

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

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

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

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

第二种情况:缓冲区已满

当内部缓冲区已满并推送另一件事时,您将描述三种情况 in the code :

头部在缓冲区的末尾

缓冲区只会增长。

        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 . . . . . . ]

尾部比头短

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

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

关于collections - VecDeque 环形缓冲区在内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49072494/

相关文章:

ios - 检索 UserDefaults 后刷新 viewdidload 上的 collectionView

Java:将数组的数组转换为集合的集合,反之亦然

unit-testing - rust 中的单元测试、模拟和特征

operator-overloading - 如何在Rust中为值和引用实现惯用运算符重载?

c++ - 从 txt 文件读取到 FIFO 队列中进行处理

javascript - Html5 Websocket 和顺序处理队列

scala - 检查集合中包含的所有元组中的给定元素是否相等

java - 为什么 List.contains() 在 Collections Java 中将 Object 作为参数

rust - 火箭不设置内容类型文本/html

c - reverseList 函数不在队列中工作