gpt4 book ai didi

rust - 为什么双重反转迭代器的行为就好像它从未被反转过一样?

转载 作者:行者123 更新时间:2023-11-29 07:45:22 25 4
gpt4 key购买 nike

我有一个包含数字的输入向量。在输出向量中,我需要获得一系列部分积,但顺序是从右到左。输出的最后一个元素必须等于输入中的最后一个元素;输出的倒数第二个元素必须是输入的最后一个元素和倒数第二个元素的乘积;等等。例如,如果输入向量是

let input = vec![2, 3, 4];

然后我需要输出为 [24, 12, 4]

我的实现在输入上采用迭代器,反转它,maps,再次反转和collects:

fn main() {
let input = vec![2, 3, 4];
let mut prod = 1;
let p: Vec<usize> = input
.iter()
.rev()
.map(|v| {
prod *= v;
prod
}).rev()
.collect();
println!("{:?}", p);
}

The result is [2, 6, 24] ,就像我删除了两个 rev() 一样。两个rev()并没有解决问题,它们只是互相“歼灭”。

是否可以在不使用 for 的情况下以“调用链”方式解决此任务?

最佳答案

这个行为实际上是explicitly described in the documentation :

Notes about side effects

The map iterator implements DoubleEndedIterator, meaning that you can also map backwards:

[…]

But if your closure has state, iterating backwards may act in a way you do not expect. […]

A way to solve this将通过添加中介 collect确保第二个 rev 不适用于 Map:

fn main() {
let input = vec![2, 3, 4];
let mut prod = 1;
let p: Vec<usize> = input
.iter()
.map(|v| {
prod *= v;
prod
}).rev()
.collect::<Vec<_>>()
.into_iter()
.rev()
.collect();
println!("{:?}", p);
}

但这需要额外的分配。 Another way将是收集,然后reverse :

fn main() {
let input = vec![2, 3, 4];
let mut prod = 1;
let mut p: Vec<usize> = input
.iter()
.rev()
.map(|v| {
prod *= v;
prod
}).collect();
p.reverse();

println!("{:?}", p);
}

关于rust - 为什么双重反转迭代器的行为就好像它从未被反转过一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52011912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com