如何在Rust中获取向量的每个子集?

tim*_*lyo 5 rust

在Rust中获取向量的每个子集的最简单/最惯用的方法是什么?

let v = vec![1,2,3];
assert_eq!(subsets(v), [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]);
Run Code Online (Sandbox Code Playgroud)

eri*_*rip 11

你要搜索的是一个向量的powerset.

这是生成矢量切片的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);
}
Run Code Online (Sandbox Code Playgroud)

这里看到它.

如果您想要一个引用向量以防止复制,您可以进行简单的更改:

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()
} 
Run Code Online (Sandbox Code Playgroud)

请看这里的要点.