rust - 产生每个部分结果的折叠算法
问题描述
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
。
解决方案
你想要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]);
}
推荐阅读
- javascript - Cypress.io - 等待页面完成加载的时间过长
- knockout.js - 模板脚本内的 KnockoutJS Containerless foreach
- javascript - React Reducer 无法识别 action.type 比较
- db2 - RPGLE 中的嵌入式 SQL 在 Update 中的性能
- java - Android SearchView - 更改光标颜色
- javascript - 将 html 表单 + 表格下载为 xml/csv 文件
- c# - 如何将公共依赖项传递给每个 WCF 服务实例
- python - 如何在 ubuntu 中使用 python 代码打开终端并在其中编写命令?
- python-2.7 - SettingWithCopyWarning 创建一个新列。执行了几个选项,但获得了相同的结果
- asp.net-core - 仅在使用实体框架控制器提交后发布表单