1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
pub trait VecUtils<T> { fn power_set(&self) -> Vec<Vec<T>>; } impl<T> VecUtils<T> for Vec<T> where T: Clone, { fn power_set(&self) -> Vec<Vec<T>> { let n = self.len(); (0..1 << n) .map(|pattern| { (0..n) .filter_map(|i| { if (pattern >> i) & 1 == 1 { Some(self[i].clone()) } else { None } }) .collect::<Vec<T>>() }) .collect() } } #[cfg(test)] mod test { use super::*; #[test] fn vec_test() { let mut test = vec![0, 1, 2]; assert_eq!( vec![ vec![], vec![0], vec![1], vec![0, 1], vec![2], vec![0, 2], vec![1, 2], vec![0, 1, 2] ], test.power_set() ); test.push(3); test.push(4); assert_eq!(test.power_set().len(), 32); } }