首页 > 解决方案 > 使用 1 个或多个元素使用和替换向量中的元素

问题描述

我试图找出一种有效的 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]

PS。我知道splice 方法可以实现我所需要的,但我还需要在 for 循环内有一个可变引用。

标签: rust

解决方案


由于您正在更改 的大小Vec,因此很可能无论如何都需要重新分配。此外,您在迭代它的时候不能改变Vec它(正是因为改变它可能会导致它重新分配)。收集到一个新的不会有太大的不同Vec

myvec = myvec
    .drain(..)
    .flat_map(|val| iter::once(val + 2).chain(iter::once(val + 4)))
    .collect();

链式迭代器可能不是最佳的。在夜间 Rust中,您可以执行以下操作:

#![feature(array_value_iter)]

use std::array;

myvec = myvec
    .drain(..)
    .flat_map(|val| array::IntoIter::new([val + 2, val + 4]))
    .collect();

哪个应该更有效。


推荐阅读