使用旧的 Rust 2015
0.1.2 |
|
---|---|
0.1.1 |
|
0.1.0 |
|
#87 in #转换
37KB
899 行
David-set
这是一个针对实现了 Copy
特质的少量或大量元素进行空间和时间优化的集合。这个 Copy
约束很方便,但通过更多的工作,这个集合可以适用于任意类型(当然,支持 Eq
和 Hash
)。
最终它需要一个更好的名字。
要运行基准测试套件,请进入 bench
目录,然后运行
cargo +nightly run --release
如果已经通过 rustup 安装了 nightly rust,这应该可以工作。
lib.rs
:
David-set 包含几个针对少量元素进行优化,同时在元素数量较多时也能很好地扩展大小和时间的集合。我们有两种集合类型
-
Set
基本上可以与HashSet
互换使用,尽管它要求其元素实现Copy
特质,否则我就不得不学习编写正确的unsafe
代码,这会很可怕。 -
CastSet
对其元素的要求更严格,必须具有Cast
特质。这适用于那些是Copy
,可以廉价地转换为usize
,并且足够均匀分布,不需要真正的哈希。基本上,这适用于您想存储数组索引集合的情况。所有基本整数类型都应该满足Cast
特质。哦,这个集合还要求您的类型中有一个值是“无效的”。对于无符号整数类型,我们取它们的最大值作为无效值。这个约束使我们能够节省更多空间。
这两个集合类型在少量小元素的小集合上都不会进行堆分配。在 CastSet
进行任何堆分配之前,它可以存储多达 16 字节元素,而 Set
在不进行分配的情况下可以存储大小为 8 的集合。这两个集合通常比 HashSet
快大约两倍,尽管对于超过 8 个元素的集合,实际上 Set
的性能与 HashSet
相同。
示例
use david_set::Set;
let mut s: Set<usize> = Set::new();
s.insert(1);
assert!(s.contains(&1));
use david_set::CastSet;
let mut s: CastSet<usize> = CastSet::new();
s.insert(1);
assert!(s.contains(&1));