在Rust中获取向量的每个子集的最简单/最惯用的方法是什么?
let v = vec![1,2,3];
assert_eq!(subsets(v), [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]);
最佳答案
您要搜索的内容称为向量的powerset。
这是生成矢量切片的幂集的代码。
fn powerset<T>(s: &[T]) -> Vec<Vec<T>> where T: Clone {
(0..2usize.pow(s.len() as u32)).map(|i| {
s.iter().enumerate().filter(|&(t, _)| (i >> t) % 2 == 1)
.map(|(_, element)| element.clone())
.collect()
}).collect()
}
fn main() {
let v = vec![1,2,3];
println!("{:?}", v);
let pset = powerset(&v);
println!("{:?}", pset);
}
在行动中查看它here。
如果希望使用引用向量来防止复制,则可以进行简单的更改:
fn powerset<T>(s: &[T]) -> Vec<Vec<&T>> {
(0..2usize.pow(s.len() as u32)).map(|i| {
s.iter().enumerate().filter(|&(t, _)| (i >> t) % 2 == 1)
.map(|(_, element)| element)
.collect()
}).collect()
}
有关要点,请参见here。
关于rust - 如何在Rust中获取向量的每个子集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40718975/