2个不稳定版本
0.2.0 | 2022年3月19日 |
---|---|
0.1.2 | 2022年3月18日 |
#2237 在 数据结构
27 每月下载量
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