假设我有一个向量,它上面有一个过滤器,我想把它分解成两个向量:一个过滤向量和它的补码.我认为有两种方法可以做到这一点.第一个是for循环:
let vct: Vec<u32> = vec![1, 3, 4, 7, 9, 10, 12];
let filter = |x| x % 3 == 0;
let mut filtered: Vec<u32> = Vec::new();
let mut complement: Vec<u32> = Vec::new();
for v in vct {
if filter(v) {
filtered.push(v);
} else {
complement.push(v);
}
}
println!("{:?}", filtered); //[3, 9, 12]
println!("{:?}", complement); //[1, 4, 7, 10]
这似乎很有效,但不必要地冗长(并为向量添加了不必要的可变性).另一种是使用迭代器的简单方法:
let vct: Vec<u32> = vec![1, 3, 4, 7, 9, 10, 12];
let filter = |x:&&u32| *x % 3 == 0;
let filtered: Vec<u32> = vct.iter().filter(filter).cloned().collect();
let complement: Vec<u32> = vct.into_iter().filter(|x| !filter(&x)).collect();
println!("{:?}", filtered); //[3, 9, 12]
println!("{:?}", complement); //[1, 4, 7, 10]
它有一个更清晰的意图,也不太冗长(除了filter
定义/用法,这有点难看),但在数组上迭代twice次,这似乎是不必要的.
这两种解决方案似乎都不是最优的.
是否有一种惯用的and有效方法(无需重新迭代)将向量拆分为过滤器及其补码?