2017-04-21 40 views
6

在Rust中,我該如何避免編寫這些循環?該代碼需要一個向量並將三個相鄰元素乘以一個產品。因此,外部循環遍歷所有可以形成一組三個的元素,內部循環完成乘法。如何在遍歷向量的相鄰元素時避免循環

我認爲,難點在於外循環的不完整迭代(從元素0last - 3)。此外,內部循環必須使用子範圍。

有沒有辦法避免編寫循環?

let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
let mut products = Vec::new(); 
for seq in 0..v.len() - 3 { 
    let mut product = 1; 
    for offset in 0..3 { 
     product *= v[seq + offset]; 
    } 
    products.push(product); 
} 
+0

,所有的計算'product's被丟棄,虛無的,而不是在矢量寫下所有數字手動你可以寫這篇文章,而不是發生。你想把所有這些產品收集到一個載體中,或者你想用它們做什麼? –

+0

你說得對。在將我的原始代碼剪切到上面的示例中時,它已經丟失了。我做了一個編輯。 – dani

回答

8

您正在搜索的功能是[T]::windows()。您可以指定重疊窗口的大小,它將通過子片返回一個迭代器。

您可以通過使用迭代器並使用Iterator::product()來獲得子片內所有元素的乘積。

let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
let products: Vec<u64> = v.windows(3) 
    .map(|win| win.iter().product()) 
    .collect(); 

Playground

在這裏,我們收集所有產品進入一個新的載體。


最後要注意:現在真的

let v: Vec<_> = (1..10).chain(1..10).collect();