6 个版本
0.2.3 | 2024 年 5 月 14 日 |
---|---|
0.2.2 | 2024 年 5 月 14 日 |
0.1.1 | 2024 年 5 月 7 日 |
#595 在 算法 中
每月 27 次下载
29KB
660 行
iter-set-ops
在任意数量的排序去重迭代器上进行快速集合操作。
特性
- 任意数量集合的集合操作
- 零拷贝:每个项目从其迭代器中重复使用,不进行复制
- 自定义比较运算符,使用
merge_iters_by
/intersect_iters_by
- 惰性交集:当其中一个集合耗尽时,计算停止
示例用法
use iter_set_ops::intersect_iters;
let it1 = 1u8..=5;
let it2 = 3u8..=7;
let it3 = 2u8..=4;
let mut iters = [it1, it2, it3];
// intersect it1, it2 and it3
let res: Vec<_> = intersect_iters(&mut iters).collect();
assert_eq!(res, vec![3, 4]);
// the computation stops before exhausting all the iterators
assert!(iters[1].next().is_some());
use iter_set_ops::merge_iters_by;
let it1 = (1u8..=5).rev();
let it2 = (3u8..=7).rev();
let it3 = (2u8..=4).rev();
let mut iters = [it1, it2, it3];
// merge it1, it2 and it3 using a reverse comparison operator
let res: Vec<_> = merge_iters_by(&mut iters, |x, y| y.cmp(x)).collect();
assert_eq!(res, vec![7, 6, 5, 4, 3, 2, 1]);
use iter_set_ops::merge_iters_detailed;
let it1 = 1u8..=2;
let it2 = 2u8..=3;
let mut iters = [it1, it2];
// merge it1 and it2 while keeping the details of each item
let res: Vec<_> = merge_iters_detailed(&mut iters).collect();
assert_eq!(
res,
vec![
vec![(0, 1)], // `1` comes from the first iterator
vec![(1, 2), (0, 2)], // `2` comes from both iterators
vec![(1, 3)] // `3` comes from the second iterator
]
);
依赖项
~100KB