如何操作矢量的子集?

Rob*_*ham 1 rust

我理解如何操作整个矢量,虽然我不认为这是惯用的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));
}
Run Code Online (Sandbox Code Playgroud)

但是如果我只想操作这个矢量的一半呢?例如,第一个四分位数是下半部分的中位数,第三个四分位数是上半部分的中位数.我的第一个想法是构建两个新的向量,但这似乎不太正确.

我如何得到"一半"的向量?

She*_*ter 6

如前所述,要创建一个切片使用Index特点Range:

let slice = &v1[0..v1.len() / 2];
Run Code Online (Sandbox Code Playgroud)

这是为什么不鼓励接受a的&Vec另一个原因.当前代码需要将切片转换为已分配的切片Vec.相反,重写它以接受切片:

fn median(v: &[u32]) -> f32 {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

由于您可能有兴趣将矢量/切片分成两半并获得两个部分,因此split_at可能是相关的:

let (head, tail) = v1.split_at(v1.len() / 2);
println!("{:.*}", 1, median(head));
println!("{:.*}", 1, median(tail));
Run Code Online (Sandbox Code Playgroud)