2016-11-05 73 views
1

我知道如何對整個矢量操作,雖然我不認爲這是地道的防鏽:如何操作矢量的子集?

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)); 
} 

但是,如果我想要操作僅此矢量的一半呢?例如,第一個四分位數是下半部分的中位數,第三個四分位數是上半部分的中位數。我的第一個想法是構建兩個新的載體,但看起來不太正確。

我該如何獲得「半」矢量?提到

+1

關於如何通過迭代器請檢查[這裏](http://stackoverflow.com/questions/34969902/how-to-write-a-rust-function-that-takes-an-iterator)。對於你的第一個問題,你可以分一杯羹,例如'let slice =&v1 [0..v1.len()/ 2]' – Jack

+0

[每個問題請問一個問題](http://meta.stackexchange.com/q /281829分之39223)。既然你的「接受一個迭代器」的問題已經有了重複,我剛剛刪除了它。 – Shepmaster

回答

5

爲,要使用Index traitRange創建slice

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

這是另一個原因why it is discouraged to accept a &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));