#集合 #位字段 #稀疏 #索引 #集合位 #位字段

index-set

一个有序集合,在稀疏位字段中存储索引

1 个不稳定版本

0.1.0 2019年1月12日

#2334数据结构

MIT 许可证

62KB
1K SLoC

index-set

一个有序集合,在稀疏位字段中存储索引。

Crates.io

文档

用法

将以下内容添加到 Cargo.toml

[dependencies]
index-set = "0.1"

许可证

此项目采用 MIT 许可证


lib.rs:

一个有序集合,在稀疏位字段中存储索引。

IndexSet 与普通集合类似,但只存储其元素的索引。实际上,IndexSet 存储元素是否属于集合,同时允许元素本身存储在其他地方;IndexSet 不对其元素拥有所有权,甚至不拥有它们的引用,并且元素可以同时出现在多个 IndexSet 中。

IndexSet 也可以作为在有序集合中高效存储整数的有效方式。

有关 IndexSet 的更多信息,请参阅文档。

示例

基本用法

use index_set::{IndexSet, ToIndex};

enum Topping {
    Anchovies,
    Cheese,
    Ham,
    Pineapple,
}

impl ToIndex for Topping {
    type Index = u8;

    fn to_index(&self) -> u8 {
        match self {
            Topping::Anchovies => 0,
            Topping::Cheese    => 1,
            Topping::Ham       => 2,
            Topping::Pineapple => 3,
        }
    }
}

let mut pizza = IndexSet::<Topping>::new();
pizza.insert(&Topping::Cheese);
pizza.insert(&Topping::Ham);
pizza.insert(&Topping::Pineapple);

assert_eq!(pizza.contains(&Topping::Pineapple), true);
assert_eq!(pizza.contains(&Topping::Anchovies), false);

存储整数

use index_set::IndexSet;

let mut set = IndexSet::<u32>::new();
set.insert(&1000000);
set.insert(&1);
set.insert(&3);
set.insert(&2);

let vec: Vec<u32> = set.into_iter().collect();
assert_eq!(vec, [1, 2, 3, 1000000])

实现

内部,IndexSet 使用稀疏位字段来表示集合中索引的存在。位字段被分成256位的桶,并存储在 BTreeMap 中。

无运行时依赖