7 个版本
0.1.6 | 2021年3月21日 |
---|---|
0.1.5 | 2021年3月21日 |
#1518 在 数据结构 中
14KB
97 行
FlagSet
HashSet
仅实现普通集合。当补集是无限集时,HashSet
无法表示其补集。
FlagSet
通过一个 HashSet
和一个 bool
值的元组来实现。当 bool
值为 true 时,FlagSet
表示 HashSet
。当 bool
值为 true 时,FlagSet
表示 HashSet
的补集。
与 HashSet
类型一样,FlagSet
需要元素实现 Eq
和 Clone
特性。
FlagSet
还定义了基于 Binary Operations
的五种集合操作。
A ∪B -> A + B
A ∩ B -> A & B
A - B -> A - B
A Xor B -> A ^ B
CuA -> !A
示例
use std::collections::HashSet;
use flag_set::FlagSet;
let a: HashSet<_> = vec![1, 2, 3].into_iter().collect();
let b: HashSet<_> = vec![2, 3, 4].into_iter().collect();
let flag_ap = FlagSet(a.clone(), true);
let flag_an = FlagSet(a.clone(), false);
let flag_bp = FlagSet(b.clone(), true);
let flag_bn = FlagSet(b.clone(), false);
// 用new方法创建实例
// use new method create an instance
assert_eq!(flag_bn, FlagSet::new(vec![2, 3, 4], false));
// 测试并
// test union
assert_eq!(FlagSet::new(vec![1, 2, 3, 4], true), flag_ap.clone() + flag_bp.clone());
assert_eq!(FlagSet::new(vec![4], false), flag_ap.clone() + flag_bn.clone());
assert_eq!(FlagSet::new(vec![1], false), flag_an.clone() + flag_bp.clone());
assert_eq!(FlagSet::new(vec![2, 3], false), flag_an.clone() + flag_bn.clone());
// 测试交
// test intersection
assert_eq!(FlagSet::new(vec![2, 3], true), flag_ap.clone() & flag_bp.clone());
assert_eq!(FlagSet::new(vec![1], true), flag_ap.clone() & flag_bn.clone());
assert_eq!(FlagSet::new(vec![4], true), flag_an.clone() & flag_bp.clone());
assert_eq!(FlagSet::new(vec![1, 2, 3, 4], false), flag_an.clone() & flag_bn.clone());
// 测试减
// test substraction
assert_eq!(FlagSet::new(vec![1], true), flag_ap.clone() - flag_bp.clone());
assert_eq!(FlagSet::new(vec![2, 3], true), flag_ap.clone() - flag_bn.clone());
assert_eq!(FlagSet::new(vec![1, 2, 3, 4], false), flag_an.clone() - flag_bp.clone());
assert_eq!(FlagSet::new(vec![4], true), flag_an.clone() - flag_bn.clone());
// 测试否
// test not
assert_eq!(FlagSet(a.clone(), true), !flag_an.clone());
// 测试对称差
// test symmetric difference
assert_eq!(FlagSet::new(vec![1, 4], true), flag_ap.clone() ^ flag_bp.clone());