2016-11-05 3 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-aniterator)를 확인하십시오. 첫 번째 질문은 슬라이스를 취할 수 있습니다. 예를 들어'let slice = & v1 [0..v1.len()/2]' – Jack

+0

[질문 당 한 가지 질문] (http://meta.stackexchange.com/q/39223/281829). "반복자 허용"질문에 이미 중복 된 항목이 있으므로 삭제 한 것입니다. – 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)); 
관련 문제