Rust 在scan()迭代器中检索状态?
要获得整数序列的部分和,我可以在迭代器上使用Rust 在scan()迭代器中检索状态?,rust,iterator,Rust,Iterator,要获得整数序列的部分和,我可以在迭代器上使用scan(),如下所示: let partial: Box<[u32]> = list .iter() .scan(0, |st, elem| { let ret = *st; *st += elem; Some(ret) }) .collect(); let partial:Box= 列表 .国际热核实验堆(iter) .scan(0,| st,el
scan()
,如下所示:
let partial: Box<[u32]> =
list
.iter()
.scan(0, |st, elem| {
let ret = *st;
*st += elem;
Some(ret)
})
.collect();
let partial:Box=
列表
.国际热核实验堆(iter)
.scan(0,| st,elem |{
设ret=*st;
*st+=元素;
一些(ret)
})
.收集();
上面的代码运行得很好,但我正在尝试修改它,以获得总的总和
比如:
let (partial, total): (Box<[u32]>, u32) =
list
.iter()
.scan(0, |st, elem| {
// TODO
})
.collect();
let(部分,总计):(框,u32)=
列表
.国际热核实验堆(iter)
.scan(0,| st,elem |{
//待办事项
})
.收集();
似乎我只需要获得st
的最终值,迭代器应该已经知道它的值。但是,除了在整个序列上进行第二次迭代(例如使用fold()
),我似乎找不到检索该值的方法
有没有一种方法可以在一次传递中找到部分和和和的总和?您必须决定在闭包中要做什么 正如代码中所示,您还记得
ret=*st
,这是加法发生之前累加器的值,然后返回Some(ret)
。因此,您在结果中得到的第一项当前是0
如果要在求和后返回值,只需返回
Some(*st)
,这是加法后更新的累加器值。您必须决定要在闭包中执行什么操作
正如代码中所示,您还记得ret=*st
,这是加法发生之前累加器的值,然后返回Some(ret)
。因此,您在结果中得到的第一项当前是0
如果您想要求和后的值,您应该只返回
Some(*st)
,这是加法后更新的累加器值。在扫描中包括总和,但然后分割最后一个值
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);
}
在扫描中包括总和,但随后将最后一个值拆分
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);
}
您的第一个代码段的开头是零,而忽略列表的最后一个元素,这是有意的吗?(即对于list=[1,2,3,4]
,输出是[0,1,3,6]
,忽略4
@SCappella是的,这是有意的。我正在编写一个编译器,部分和用于测量结构中每个元素的偏移量(忽略对齐问题)。然后,总和将是结构的大小。是否有意让第一个代码段的开头为零,而忽略列表的最后一个元素?(即对于list=[1,2,3,4]
,输出为[0,1,3,6]
,忽略4
@SCappella是的,这是故意的。我正在编写一个编译器,部分和用于测量结构中每个元素的偏移量(忽略对齐问题)。总的总和就是结构的大小。这可能是本例中最好的答案,但我最终编写了一个新的迭代器traitscan_ref()
通过引用而不是值获取第一个参数,感觉更干净。这可能是本例中的最佳答案,但我最终编写了一个新的迭代器traitscan_ref()
通过引用而不是值获取第一个参数,感觉更干净。