首页 > 解决方案 > 产生每个部分结果的折叠算法

问题描述

rust 标准库有一个fold()将迭代器折叠成单个结果的方法:

let a = [1, 2, 3];

// the sum of all of the elements of the array
let sum = a.iter().fold(0, |acc, x| acc + x);

assert_eq!(sum, 6);

标准库是否具有产生每个元素的等效版本?也就是说,类似:

let partial_sums = a.iter()
   .what_goes_here(0, |acc, x| acc + x)
   .collect::<Vec<_>>();
assert_eq!(partial_sums, vec![1, 3, 6]);

实际上,iter.fold(init, f)在语义上等价于

iter
    .what_goes_here(init, f)
    .last()
    .unwrap_or(init)

对于与我同船的任何人,我正在寻找与 C++ 算法等效的 Rust partial_sum

标签: rust

解决方案


你想要Iterator::scan

fn main() {
    let v = vec![1, 2, 3];
    let res = v
        .iter()
        .scan(0, |acc, &x| {
            *acc += x;
            Some(*acc)
        })
        .collect::<Vec<_>>();
    assert_eq!(res, vec![1, 3, 6]);
}

推荐阅读