gpt4 book ai didi

rust - 使用1个或多个元素消耗和替换向量中的元素

转载 作者:行者123 更新时间:2023-12-03 11:44:08 26 4
gpt4 key购买 nike

我试图找出一种有效的Rust方式,使用向量的元素并将其替换为一个或多个(相同类型的)元素,例如在非编译示例中:

fn main() {
let mut myvec = vec![0, 1];
println!("{:?}", myvec);

for val in myvec.drain(..) {
myvec.push(val+2);
myvec.push(val+4);
}
println!("{:?}", myvec);
}
但是,我什至不确定Rust是否会允许,因为每个操作都需要一个可变的引用(即我们需要2个可变的引用),但是Rust只能允许一个。有没有一种方法可以做我想做的事情,或者我只需要有两个单独的向量:
let mut myvec = vec![0, 1];
let mut newvec = Vec::new();
println!("{:?}", myvec);

for val in myvec.drain(..) {
newvec.push(val+2);
newvec.push(val+4);
}
println!("{:?}", newvec);
输出:
[0, 1]
[2, 4, 3, 5]
PS。我知道 splice method可以实现我需要的功能,但是我还需要在for循环内使用可变的引用。

最佳答案

由于您正在更改Vec的大小,因此无论如何都可能需要重新分配。此外,您无法在对Vec进行迭代时对其进行变异(正是因为对其进行变异可能导致其重新分配)。收集到新的Vec中并没有什么不同:

myvec = myvec
.drain(..)
.flat_map(|val| iter::once(val + 2).chain(iter::once(val + 4)))
.collect();
链式迭代器可能不是最佳的。 In nightly Rust,您可以执行以下操作:
#![feature(array_value_iter)]

use std::array;

myvec = myvec
.drain(..)
.flat_map(|val| array::IntoIter::new([val + 2, val + 4]))
.collect();
哪个应该更有效。

关于rust - 使用1个或多个元素消耗和替换向量中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65843013/

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