如何减少(折叠)迭代器并保留中间结果(例如累计和)?

时间:2019-03-11 10:33:56

标签: rust iterator

我想对迭代器进行归约,但是我不需要最终值,中间结果也很重要。

作为一个例子,让我们将距离向量转换为位置向量:

let distances = vec![3, 2, 1, 4];
// create positions vector [3, 5, 6, 10]

我尝试的解决方案使用map和闭包:

let mut acc = 0;
let positions: Vec<i32> = distances
    .iter()
    .map(|x| {
        acc = acc + x;
        acc
    })
    .collect();

@starblue的好评:要进行累加,fold是最好的选择。它应用减少量并返回最后一个值。它不会返回中间解决方案:

// basically exact code from fold example in the docs
let last_position = distances.iter().fold(0, |acc, x| acc + x);

1 个答案:

答案 0 :(得分:5)

我发现我应该更仔细地阅读docs。我要查找的函数称为scan。这是一个累计总和实现:

let distances = vec![3, 2, 1, 4];
let positions: Vec<i32> = distances
        .iter()
        .scan(0, |acc, &x| {
            *acc = *acc + x;
            Some(*acc)
        })
        .collect();