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