3 个不稳定版本
| 新功能 0.2.2 | 2024 年 8 月 22 日 |
|---|---|
| 0.2.1 | 2023 年 5 月 25 日 |
| 0.1.2 | 2023 年 5 月 24 日 |
#43 in 值格式化
80 每月下载次数
用于 sat_lab
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![] 宏初始化
就像使用 Vec 的 vec![] 宏一样,您可以使用 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