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