【发布时间】:2021-01-22 10:02:48
【问题描述】:
我正在尝试找出一种有效的 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 只能允许一个。有没有办法做我想做的事,还是我只需要有 2 个独立的向量:
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]
附言。我知道splice method 可以实现我所需要的,但我还需要在 for 循环内有一个可变引用。
【问题讨论】:
-
鉴于您正在使 vec 更大,它可能需要重新分配,并且可能创建一个新的 Vec 不会更糟,性能方面
-
是的,我认为没有任何简单的方法可以执行“就地平面图”。您总是可以从一端
remove()条目并将它们添加到另一端,但是 vec 然后需要移动所有不会很快的项目(那时 vecdeque 会更有效)。实际上,您在这里会遇到同样的问题:第一个项目将替换正在耗尽的项目,但第二个项目将不得不“碰撞”向量中剩余的所有项目。
标签: rust