#values #key #collection #storing #index #single #ordered

sharedvec

用于存储单一类型值的快速但有限的集合

2个不稳定版本

0.2.0 2022年3月19日
0.1.2 2022年3月18日

#2237数据结构

27 每月下载量

MIT 协议

26KB
507

SharedVec    构建状态 最新版本

SharedVec 是一个 快速但有限的有序集合,用于存储单一类型的值。

什么是 SharedVec

SharedVec 是一个快速且有序的集合,类似于 Vec,可以将值推送到上面。与 Vec 相比,SharedVec 允许通过共享引用来推送值。推送值的操作是 O(1) 的,并且永远不会重新定位之前推送的值,即之前值保持在一个稳定的内存地址中。这使通过共享引用安全推送成为可能。

推送值时,SharedVec 除了返回一个键外,还会返回值的一个共享引用。这个键不会从 SharedVec 借用(它不借用)。因此,它可以比引用更自由地传递,并且还可以有意义地进行序列化(详情见下文)。此外,如果给 SharedVec 一个独占引用,该键也可以用于在 O(1) 时间内获取值的独占引用。每个键对应一个 索引,指示值在 SharedVec 中的位置。值也可以通过它们的索引以 O(log n) 的时间复杂度访问。迭代 SharedVec 或将其转换为 Vec 也会保留值在 SharedVec 上推送的顺序。

以下是一个类似数据结构及其差异的列表

  • TypedArena 不提供键,并返回通过共享引用插入的值的独占引用。键是有用的,因为它独立于 SharedVec(它不借用)。因此,它可以比引用更自由地传递,并且还可以有意义地进行序列化(详情见下文)。
  • 一个 Slab 和一个 SlotMap 不能通过共享引用进行修改。如果不需要通过共享引用进行修改,那么可以考虑它们,因为它们通常要灵活得多。

序列化

使用 serde 功能标志,SharedVec 和它的键可以用 Serde 进行序列化。

存储类型为 T 的值的 SharedVec 被序列化为一个类型为 T 的序列,就像一个 Vec 一样,键被序列化为这个序列的索引。这使得外部工具可以简单地将其视为序列中的索引。使用之前序列化并反序列化的键来访问值,而不需要同时序列化和反序列化相应的 SharedVec,这是一个 O(log n) 操作(就像通过索引访问一样)。

这种确切的序列化行为被认为是稳定性保证的一部分。

示例

let vegetables = SharedVec::<&'static str>::new();

let (cucumber_key, cucumber) = vegetables.push("Cucumber");
let (paprika_key, paprika) = vegetables.push("Paprika");

assert_eq!(vegetables[cucumber_key], "Cucumber");

assert_eq!(Vec::from(vegetables), vec!["Cucumber", "Paprika"]);

依赖项

~175KB