#values #key #storing #collection #single #limited #index

已撤回 stacko

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

0.1.1 2022年3月18日
0.1.0 2022年3月18日

#45 in #limited

MIT 许可证

26KB
491

Stacko    pipeline

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

什么是 Stacko

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

当推入一个值时,Stacko 除了返回一个 之外,还会返回该值的引用。键不会从 Stacko 借用,并且可以在 O(1) 内检索值。此外,给定对 Stacko 的独占引用,可以使用键在 O(1) 内获得值的独占引用。每个键对应一个插入 索引。值也可以通过它们的插入索引在 O(log n) 内访问。遍历一个 Stacko 或将其转换为 Vec 也会保留插入顺序。

无法从 Stacko 中移除值。

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

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

序列化

使用serde功能标志,可以将Stacko及其键序列化为Serde

存储类型为T的值的Stacko被序列化为类型为T的序列,就像类型为TVec一样,键被序列化为该序列的相应插入索引。这使得外部工具可以简单地将键视为序列中的索引。使用先前序列化和反序列化的键来访问值,而不需要序列化和反序列化相应的Stacko,这是一个O(log n)操作(就像按索引访问一样)。

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

示例

let vegetables = Stacko::<&'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"]);

依赖项

~170KB