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

问题描述 投票:2回答:1

我想对迭代器应用简化,但我不需要最终值,中间结果也很重要。

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

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);
rust iterator
1个回答
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();
© www.soinside.com 2019 - 2024. All rights reserved.