17个稳定版本 (3个主要版本)
3.0.3 | 2023年8月2日 |
---|---|
3.0.2 | 2022年7月25日 |
3.0.1 | 2021年10月22日 |
2.0.6 | 2021年1月25日 |
0.1.0 | 2018年2月1日 |
#107 在 数据结构 中
15,911 每月下载量
在 23 个crate中使用了 (13直接使用)
67KB
1K SLoC
位向量(Vob)
Vob是“位向量”:一系列位,它提供了一个类似于Vec
的接口。与需要每个位1字节存储空间的Vec<bool>
相比,Vob
每个位只需要1位存储空间。Vob
在功能上与BitVec相似,但API与Vec<bool>
更接近,并允许非32位后端存储。在64位系统上,这可以带来显著的性能提升,尤其是在使用诸如iter_set_bits
之类的函数时。
使用方法
use vob::vob;
let mut v = vob![false, true, false];
assert_eq!(v[2], false);
v.set(2, true);
assert_eq!(v[2], true);
assert_eq!(v.iter_set_bits(..).collect::<Vec<_>>(), vec![1, 2]);
从Vec<bool>
迁移
尽可能让Vob
具有与Vec<bool>
相同的接口,这应该使大多数代码的移植变得相当简单。然而,Vec<bool>
包含了一些在Vob
中尚未实现的功能:这些功能的缺失仅仅是因为缺乏当前的使用案例,而不是因为任何根本的不兼容性。
目前有一个缺失的功能,目前无法实现:向索引赋值。换句话说,目前无法对 v[0] = true
进行表达,用于一个 Vob
v
。在 rustc
中实现了 IndexGet
/ IndexMove
以及等效功能 之前,这种限制似乎是不可避免的。请注意,通过索引引用是可行的(尽管是通过与在 BitVec
中使用的相同黑客方式):例如,可以对 Vob
v
编写 println!("{}", v[0])
。
从 BitVec
迁移
Vob
直接受到 BitVec
库的启发,但旨在提供一个更接近于 Vec<bool>
的接口。在 BitVec
中的一些函数在 Vob
中具有不同的名称,但迁移通常相当简单。主要的语义差异是,Vob
的 clear()
函数清空 Vob
的内容(即将其长度设置为 0),而 BitVec
中同名函数取消设置所有位(长度保持不变)。使用 Vob
的 set_all(false)
函数可以实现与 BitVec
的 clear
相同的效果。
依赖项
~95–335KB