0.1.1 |
|
---|---|
0.1.0 |
|
#45 in #limited
26KB
491 行
Stacko
Stacko
是一个 快速但有限的有序集合,用于存储单一类型的值。
什么是 Stacko
?
Stacko
是一个快速且有序的集合,类似于 Vec
,可以将值推入。与 Vec
相比,Stacko
允许通过共享引用来推入值。推入值是一个 O(1) 操作,并且永远不会重新定位之前推入的值,即,之前的值始终在内存中保持稳定的地址。这允许通过共享引用安全地推入。
当推入一个值时,Stacko
除了返回一个 键 之外,还会返回该值的引用。键不会从 Stacko
借用,并且可以在 O(1) 内检索值。此外,给定对 Stacko
的独占引用,可以使用键在 O(1) 内获得值的独占引用。每个键对应一个插入 索引。值也可以通过它们的插入索引在 O(log n) 内访问。遍历一个 Stacko
或将其转换为 Vec
也会保留插入顺序。
无法从 Stacko
中移除值。
以下是一个类似数据结构及其差异的列表
TypedArena
不提供键,并且通过共享引用插入值时返回一个独占引用。键是有用的,因为它独立于Stacko
存在(它不借用)。因此,它比引用更自由地传递,也可以有意义地序列化(详情见下文)。Slab
和SlotMap
不能通过共享引用进行突变。如果不需要通过共享引用进行突变,那么您可以考虑它们,因为它们通常要灵活得多。
序列化
使用serde
功能标志,可以将Stacko
及其键序列化为Serde。
存储类型为T
的值的Stacko
被序列化为类型为T
的序列,就像类型为T
的Vec
一样,键被序列化为该序列的相应插入索引。这使得外部工具可以简单地将键视为序列中的索引。使用先前序列化和反序列化的键来访问值,而不需要序列化和反序列化相应的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