1 个稳定版本
1.0.0 | 2024年4月14日 |
---|
#1151 in 数据结构
54KB
1.5K SLoC
Lazy Cogs
一个使用不可变数据结构概念的 Rust 库,实现了简单的惰性可克隆数据结构。
什么是惰性克隆?
惰性克隆是一种在 O(1) 时间内克隆数据结构的技术。这意味着克隆数据结构所需的时间是恒定的,并且“不依赖于结构中包含的数据量”。
这是如何实现的?
引用计数。Lazy Cogs 在幕后使用 Clone::clone
而不是 Rc::clone
(对于我们的 Atomic
变体)。这是因为我们假设克隆的结构不会被修改。所以我们只是将原始数据的引用抛出。
不可变意味着我不能改变数据吗?
不是的。不可变意味着它最有可能不会被修改。但实际上你可以修改数据。当数据被修改时,实际上会进行 Clone::clone
操作。在我们的内置实现中,我们确保每次尝试修改数据都不会影响任何其他克隆。
这就是惰性的美妙之处。为什么我要花费大量时间克隆那些可以以低廉的引用成本克隆的数据?我只有在绝对需要时才会进行克隆。
为什么使用 Lazy Cogs?
我们提供了一个 LazyClone
特性以及两个惰性克隆包装器 Lc
和 Alc
(线程安全)。这个特性有助于定义你的数据结构如何进行惰性克隆。而包装器用于包装你的结构体中不实现 LazyClone
的数据。
值得注意的是,实现 Copy
的数据不值得用 Lc
、Alc
包装,也不应该实现 LazyClone
。此外,如果有结构体已经完成了这项工作并实现了 LazyClone
,建议使用它而不是用 Lc
或 Alc
包装另一个不能通过 Lc
或 Alc
实现惰性克隆的结构体。
LazyClone
特性
这是一个具有三个方法的特性
lazy
:生成数据的惰性克隆eager
:生成数据的急切克隆(普通克隆)。当你知道数据将要被修改时很有用。is_mutable
:验证结构是否可以在不影响其懒克隆的情况下进行修改。
此特性行由 Lc
和 Alc
实现。
集合
Lazy Cogs 还提供了一些现成的懒实现集合。目前只有 LazyVec
和 LazyList
(两者都有 Atomic
变体),它们分别是 Vec
和 LinkedList
的实现。它们不是简单的包装,它们有一些内部逻辑,使得它们是懒的。