#boolean #single #vec #byte #bool #store #expose

bool_vec

一个 crate,公开了一个名为 BoolVec 的向量,允许您在单个比特中存储布尔值

3 个不稳定版本

新功能 0.2.2 2024 年 8 月 22 日
0.2.1 2023 年 5 月 25 日
0.1.2 2023 年 5 月 24 日

#43 in 值格式化

Download history 8/week @ 2024-07-05 80/week @ 2024-08-16

80 每月下载次数
用于 sat_lab

MIT 许可证

22KB
237 代码行

描述

此库公开了一个名为 BoolVec 的向量,允许您在单个字节中存储 8 个布尔值。基本上,布尔值只占用一个比特。

如何使用

请参阅下面的示例和 docs.rs 上的文档

示例

初始化空的 BoolVec

要创建一个新的 BoolVec,您可以使用 BoolVec::new()BoolVec::default()

use bool_vec::BoolVec;

let bv1 = BoolVec::new();
let bv2 = BoolVec::default();

assert_eq!(bv1, bv2);

或者,如果您已经知道所需容量,可以使用 BoolVec::with_capacity(cap)

use bool_vec::BoolVec;

let bv = BoolVec::with_capacity(3);

assert!(bv.capacity() > 0);

从 Vec 或切片初始化 BoolVec

您可以使用 BoolVec::from(S) 从实现 AsRef<[bool]> 的任何内容中初始化一个 BoolVec。这包括向量和切片

use bool_vec::BoolVec;

let bv1 = BoolVec::from([true, false, true]);
let bv2 = BoolVec::from(vec![true, false, true]);

assert_eq!(bv1, bv2);

使用 boolvec![] 宏初始化

就像使用 Vecvec![] 宏一样,您可以使用 boolvec![] 宏来初始化一个 BoolVec

use bool_vec::{BoolVec, boolvec};

let bv1 = BoolVec::new();
let bv2 = boolvec![];

assert_eq!(bv1, bv2);

let bv3 = boolvec![true, true, true];
let bv4 = boolvec![true; 3];

assert_eq!(bv3, bv4);

向 BoolVec 中推送值

您可以将布尔值推送到 BoolVec 的末尾,就像您会使用正常的 Vec 一样

use bool_vec::boolvec;

let mut bv = boolvec![true, false, true];

bv.push(true);

assert_eq!(bv, boolvec![true, false, true, true]);

从 BoolVec 中弹出值

再次强调,就像普通的 Vec 一样,你可以使用 BoolVec.pop() 方法从 BoolVec 的末尾移除项目。请注意,就像 Vec 一样,移除的值将被返回。如果没有找到值,则返回 None

use bool_vec::boolvec;

let mut bv1 = boolvec![true, false, true];
let mut bv2 = boolvec![];

assert_eq!(bv1.pop(), Some(true));
assert_eq!(bv2.pop(), None);

assert_eq!(bv1, boolvec![true, false]);

从 BoolVec 获取值

你可以使用 BoolVec.get(index) 方法从 BoolVec 获取值。如果 index 无效,则返回 None

use bool_vec::boolvec;

let bv = boolvec![true, false, true];

assert_eq!(bv.get(1), Some(false));
assert_eq!(bv.get(3), None);

在 BoolVec 中更改值

你可以使用 BoolVec.set(index, value) 方法更改 BoolVec 中任何 bool 的值。就像使用 BoolVec.get(index) 一样,如果 index 无效,则返回 None

use bool_vec::boolvec;

let mut bv = boolvec![true, false, true];

assert_eq!(bv.set(0, false), Some(()) );
assert_eq!(bv.get(0), Some(false));

assert_eq!(bv.set(3, false), None);

在 BoolVec 中取反值

使用 BoolVec.negate(index) 方法可以简单地取反一个值。这将更新 BoolVec 中的值,将其从 true 更改为 false,或从 false 更改为 true,然后返回取反的值。同样,如果 index 无效,则返回 None

use bool_vec::boolvec;

let mut bv = boolvec![true, false, true];

assert_eq!(bv.negate(0), Some(false));
assert_eq!(bv.get(0), Some(false));

assert_eq!(bv.negate(3), None);

从 BoolVec 获取 Vec

你可以使用 BoolVec.into_vec() 方法从 BoolVec 获取 Vec<bool>

use bool_vec::boolvec;

let bv = boolvec![true, false, true];

let vector = vec![true, false, true];

assert_eq!(bv.into_vec(), vector);

警告:建议尽可能使用 BoolVec。转换为 Vec<bool> 可能会大幅增加你的内存使用

迭代

你可以使用 for 循环迭代,或者直接使用 BoolVec.into_iter() 将你的 BoolVec 转换为 BoolVecIter

use bool_vec::boolvec;

let bv = boolvec![true; 3];

for boolean in &bv {
    assert_eq!(boolean, true);
}

let mut bv_iter = bv.into_iter();

while let Some(boolean) = bv_iter.next() {
    assert_eq!(boolean, true);
}

打印

你可以调试打印和美化打印你的 BoolVec

use bool_vec::boolvec;

let bv = boolvec![true; 3];

println!("{bv:?}");

println!("{bv:#?}"); // This will print up to 8 booleans in a single line

或者打印你 BoolVec 的底层字节

use bool_vec::boolvec;

let mut bv = boolvec![true; 9];
bv.set(2, false).unwrap();

assert_eq!(format!("{bv:b}"), "[11011111, 10000000]")

如果你不理解后者,那没关系,它主要用于调试目的,你不需要关心它。

其他

实现了你可能已经从 Vec 熟悉的其他方法,例如

  • BoolVec.len() 来获取 BoolVec 的当前长度;
  • BoolVec.capacity() 获取容量;
  • BoolVec.is_empty() 检查 BoolVec 是否为空;

依赖项

~2.1–3MB
~53K SLoC