迭代迭代矢量的相邻元素时如何避免循环

时间:2017-04-21 07:55:41

标签: loops functional-programming iterator rust

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

1 个答案:

答案 0 :(得分: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();