gpt4 book ai didi

vector - 获得矢量滤波器及其补充的惯用且有效的方法

转载 作者:行者123 更新时间:2023-12-05 01:23:20 25 4
gpt4 key购买 nike

假设我有一个向量,一个过滤器,我想将它解构为两个向量:一个过滤向量,和它的补集。我看到有两种方法可以做到这一点。第一个是 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 定义/用法,这有点丑陋),但是在数组上迭代两次,这看起来不必要。

这两种解决方案似乎都不是最优的。

是否有惯用的有效方法(无需重新迭代)将向量拆分为过滤器及其补码?

最佳答案

您尝试执行的操作称为分区。您可以使用 Iterator.partition() :

let vct: Vec<u32> = vec![1, 3, 4, 7, 9, 10, 12];
let filter: fn(u32) -> bool = |x| x % 3 == 0;

let (filtered, complement): (Vec<u32>, Vec<u32>) = vct.iter().partition(|x| filter(**x));

assert_eq!(&[3, 9, 12], filtered.as_slice());
assert_eq!(&[1, 4, 7, 10], complement.as_slice());

Playground

关于vector - 获得矢量滤波器及其补充的惯用且有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72579336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com