Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does one operate over a subset of a vector?

Tags:

rust

I understand how to operate on an entire vector, though I don't think this is idiomatic 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));
}

But what if I want to operate on only half of this vector? For example, the first quartile is the median of the lower half, and the third quartile is the median of the upper half. My first thought was to construct two new vectors, but that did not seem quite right.

How do I get "half" a vector?

like image 720
Rob Latham Avatar asked Nov 05 '16 03:11

Rob Latham


1 Answers

As mentioned, you want to create a slice using the Index trait with a Range:

let slice = &v1[0..v1.len() / 2];

This is yet another reason why it is discouraged to accept a &Vec. The current code would require converting the slice into an allocated Vec. Instead, rewrite it to accept a slice:

fn median(v: &[u32]) -> f32 {
    // ...
}

Since you are likely interested in splitting a vector / slice in half and getting both parts, split_at may be relevant:

let (head, tail) = v1.split_at(v1.len() / 2);
println!("{:.*}", 1, median(head));
println!("{:.*}", 1, median(tail));
like image 162
Shepmaster Avatar answered Sep 30 '22 08:09

Shepmaster