#bits #usize #performance #api #vec #backing #sequence

vob

带有Vec-like API和usize后端存储的位向量

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数据结构

Download history 1738/week @ 2024-03-14 1127/week @ 2024-03-21 1258/week @ 2024-03-28 1045/week @ 2024-04-04 3126/week @ 2024-04-11 2896/week @ 2024-04-18 3330/week @ 2024-04-25 2171/week @ 2024-05-02 3817/week @ 2024-05-09 3351/week @ 2024-05-16 3463/week @ 2024-05-23 4331/week @ 2024-05-30 3253/week @ 2024-06-06 3450/week @ 2024-06-13 4629/week @ 2024-06-20 3727/week @ 2024-06-27

15,911 每月下载量
23 个crate中使用了 (13直接使用)

Apache-2.0/MIT

67KB
1K SLoC

Build Status Latest version Documentation

位向量(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 中具有不同的名称,但迁移通常相当简单。主要的语义差异是,Vobclear() 函数清空 Vob 的内容(即将其长度设置为 0),而 BitVec 中同名函数取消设置所有位(长度保持不变)。使用 Vobset_all(false) 函数可以实现与 BitVecclear 相同的效果。

依赖项

~95–335KB