2016-12-18 38 views
0

我正在寫一個函數,將內容從一個Vec轉移到另一個。地道追加操作

我設法寫了兩個不同版本的相同代碼。一個更清潔,但可能更慢。

版本1:

fn move_values<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) { 
    loop { 
     let value = buffer.pop(); 
     if value.is_none() { 
      return; 
     } 
     recipient.push(value.unwrap()); 
    } 
} 

版本2:

fn move_values<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) { 
    for value in buffer.iter() { 
     recipient.push(value.clone()); 
    } 

    buffer.clear(); 
} 

我最初的直覺是,版本1是更快,因爲它僅需要通過緩衝單次運行;而版本2更「生鏽」,因爲它涉及到迭代而不是使用loop

其中哪一種更具慣用性或「更好的實踐」?

請注意,我知道append,我正在嘗試爲教育目的手動執行此操作。

回答

3

都沒有。有一個內置的操作這一點,Vec::append

移動所有進入Self的其他元素,留下其他空。

fn move_values<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) { 
    recipient.append(buffer); 
} 

無論你的函數甚至編譯:

fn move_values_1<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) { 
    loop { 
     let value = buffer.pop(); 
     if value.is_none() { 
      return; 
     } 
     recipient.push_front(card.unwrap()); 
    } 
} 
error[E0425]: unresolved name `card` 
--> src/main.rs:7:30 
    | 
7 |   recipient.push_front(card.unwrap()); 
    |        ^^^^ unresolved name 
fn move_values_2<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) { 
    for value in buffer.iter() { 
     recipient.push_front(value.clone()); 
    } 

    buffer.clear(); 
} 
error: no method named `push_front` found for type `&mut std::vec::Vec<T>` in the current scope 
--> src/main.rs:7:19 
    | 
7 |   recipient.push_front(card.unwrap()); 
    |     ^^^^^^^^^^ 

如果我要實現它自己

嗯,有一個原因,它是爲你實現,但肯定...讓我們在挖。

檢查,如果事情is_someis_none通常可以通過模式匹配避免。例如:

fn move_values_1<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) { 
    while let Some(v) = buffer.pop() { 
     recipient.push(v); 
    } 
} 

當然,這種移動的一切在相反的順序因爲壓入和彈出的VEC既發生在末端。

調用clone不會做你想要的,除非你的特質邊界說T implements Clone。否則,你只是克隆參考本身。

可避免對克隆的需求,如果你從一個收集漏值,並將其插入到其他:

for value in buffer.drain(..) { 
    recipient.push(value); 
} 

但是for環是愚蠢的,只是extend使用迭代的集合:

recipient.extend(buffer.drain(..)); 

我倒是仍然使用內置的append方法相同類型的集合之間傳輸時,要做到這一點,因爲它可能是Ø針對精確的數據佈局進行了優化,並且可能專用於某些類型的數據。

+0

將問題更改爲更接近真實問題 –

+0

我將問題改回原來的樣子,您的答案仍然相關,只是在編輯答案時提醒您提前 –

+0

@ElectricCoffee聽起來好。我相信你正在尋找的答案仍然在這個答案 - 最後一個代碼塊,具體來說。 – Shepmaster