我理解如何对整个向量进行操作,尽管我认为这不是惯用的Rust:
fn median(v: &Vec<u32>) -> f32 {
let count = v.len();
if count % 2 == 1 {
v[count / 2] as f32
} else {
(v[count / 2] as f32 + v[count / 2 - 1] as f32) / 2.0
}
}
fn main() {
let mut v1 = vec![3, 7, 8, 5, 12, 14, 21, 13, 18];
v1.sort();
println!("{:.*}", 1, median(&v1));
}
但是,如果我只想对该向量的一半进行操作,该怎么办?例如,第一个四分位数是下半部分的中位数,而第三个四分位数是上半部分的中位数。我的第一个想法是构造两个新的向量,但这似乎不太正确。
如何获得向量的“一半”?
如前所述,您想使用带有trait的特征来创建切片:Index
Range
let slice = &v1[0..v1.len() / 2];
这是不鼓励接受的&Vec
另一个原因。当前代码将需要将切片转换为分配的Vec
。而是重写它以接受切片:
fn median(v: &[u32]) -> f32 {
// ...
}
由于您可能有兴趣将向量/切片分为两半并同时获得两部分,因此split_at
可能是相关的:
let (head, tail) = v1.split_at(v1.len() / 2);
println!("{:.*}", 1, median(head));
println!("{:.*}", 1, median(tail));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句