2015-10-30 57 views
1

我試圖使用selection_sort,同時保持原有的無序向量來創建一個排序的向量:錯誤類型不匹配:預計「收藏:: VEC :: VEC <i32>」,發現「與類別:: VEC :: VEC <i32>」

fn main() { 
    let vector_1: Vec<i32> = vec![15, 23, 4, 2, 78, 0]; 
    let sorted_vector = selection_sort(&vector_1); 
    println!("{:?} is unsorted, \n{:?} is sorted.", &vector_1, &sorted_vector); 
} 

fn selection_sort(vector_1: &Vec<i32>) -> Vec<i32> { 
    let mut vector = vector_1; 
    let start = 0; 
    while start != vector.len() { 
     for index in (start .. vector.len()) { 
      match vector[index] < vector[start] { 
       true => vector.swap(index, start), 
       false => println!("false"), // do nothing 
      } 
     } 
     start += 1; 
    } 
    vector 
} 

錯誤:

Compiling selection_sort v0.1.0 (file:///home/ranj/Desktop/Rust/algorithms/sorting/selection_sort) 
src/main.rs:21:5: 21:11 error: mismatched types: 
expected `collections::vec::Vec<i32>`, 
    found `&collections::vec::Vec<i32>` 
(expected struct `collections::vec::Vec`, 
found &-ptr) [E0308] 
src/main.rs:21  vector 
        ^~~~~~ 
src/main.rs:21:5: 21:11 help: run `rustc --explain E0308` to see a detailed explanation 
error: aborting due to previous error 
Could not compile `selection_sort`. 

回答

5

你的問題可以簡化爲這(請仔細閱讀並遵守這裏怎麼提問的時候創建MCVE):

fn selection_sort(vector: &Vec<i32>) -> Vec<i32> { 
    vector 
} 

您正在接受對某個類型的引用並試圖將其作爲非引用返回。這簡直是​​一個直接的錯誤類型,與此相同:

fn something(value: &u8) -> u8 { 
    value 
} 

T&T是不同的類型。

最終,您的代碼現在沒有意義。爲了使&Vec<T>Vec<T>,你需要克隆它:

fn selection_sort(vector: &Vec<i32>) -> Vec<i32> { 
    let mut vector = vector.clone(); 
    let mut start = 0; 
    while start != vector.len() { 
     for index in (start .. vector.len()) { 
      match vector[index] < vector[start] { 
       true => vector.swap(index, start), 
       false => println!("false"), // do nothing 
      } 
     } 
     start += 1; 
    } 
    vector 
} 

但99.99%的時間,它沒有任何意義接受&Vec<T>;接受&[T]代替:

fn selection_sort(vector: &[i32]) -> Vec<i32> { 
    let mut vector = vector.to_vec(); 
    // ... 
} 
+0

那會我節省了很多打字..反正我也明白,這兩個是不同類型的,但我不知道如何複製其值 – user3419211

+0

所以,如果我理解你對,最好使用矢量的參考切片而不是對矢量的引用。做一個矢量切片不是一個額外的計算?如果我是正確的使用參考矢量vs參考切片取相同數量的內存 – user3419211

+1

從參考矢量創建切片是非常便宜。 slice是一個直接指向數據的指針,'&Vec'對於接受它的函數有一個額外的間接。 – bluss