为了获得整数序列的部分和,我可以在迭代器上使用scan()
,如下所示:
let partial: Box<[u32]> =
list
.iter()
.scan(0, |st, elem| {
let ret = *st;
*st += elem;
Some(ret)
})
.collect();
上面的代码效果很好,但是我正在尝试对其进行修改,以使我也能得到总和。
就像是:
let (partial, total): (Box<[u32]>, u32) =
list
.iter()
.scan(0, |st, elem| {
// TODO
})
.collect();
看来我只需要获取
st
的最终值,并且迭代器应该已经知道它的值。但是,我似乎找不到找到该值的方法,除非在整个序列上进行第二次迭代(例如使用fold()
)。有没有一种方法可以在一次遍历中找到部分和与总和?
最佳答案
将总和包括在scan
中,然后将最后一个值除掉。
use std::iter;
fn main() {
let list = vec![1, 2, 3, 4];
// Add zero at the start to emulate what you had before
let partial: Box<[u32]> = iter::once(0)
.chain(list.iter().scan(0, |st, elem| {
*st += elem;
Some(*st)
}))
.collect();
// unwrap since with the added zero, the slice will always be non-empty
let (total, partial) = partial.split_last().unwrap();
println!("partial sums: {:?}", partial);
println!("total sum: {}", total);
}
(playground)
或使用
successors()
:fn main() {
use std::iter::successors;
let list = vec![1, 2, 3, 4];
let mut iter = list.iter();
let partial: Vec<_> = successors(Some(0), |n| iter.next().map(|i| n + i)).collect();
// unwrap since with the added zero, the slice will always be non-empty
let (total, partial) = partial.split_last().unwrap();
assert_eq!(partial, &[0, 1, 3, 6]);
assert_eq!(total, &10);
}
(playground)
关于rust - 检索scan()迭代器中的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60541787/