使用旧的 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));