在Rust中连接向量的最佳方法

azpvetkf  于 2022-11-12  发布在  其他
关注(0)|答案(5)|浏览(113)

在Rust中有可能连接向量吗?如果有,有没有一种优雅的方法可以做到这一点?我有这样的东西:

let mut a = vec![1, 2, 3];
let b = vec![4, 5, 6];

for val in &b {
    a.push(val);
}

有人知道更好的办法吗?

omtl5h9j

omtl5h9j1#

结构std::vec::Vec具有方法append()

fn append(&mut self, other: &mut Vec<T>)

other的所有元素移到Self中,并将other保留为空。
在您的示例中,以下代码将通过mutateab连接两个向量:

fn main() {
    let mut a = vec![1, 2, 3];
    let mut b = vec![4, 5, 6];

    a.append(&mut b);

    assert_eq!(a, [1, 2, 3, 4, 5, 6]);
    assert_eq!(b, []);
}

或者,你可以使用Extend::extend()把可以转换成迭代器的东西(比如Vec)的所有元素附加到一个给定的向量上:

let mut a = vec![1, 2, 3];
let b = vec![4, 5, 6];

a.extend(b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
// b is moved and can't be used anymore

注意,向量b被移动而不是清空。如果您的向量包含实现Copy的元素,您可以将对一个向量的不可变引用传递给extend(),以避免移动。在这种情况下,向量b不会改变:

let mut a = vec![1, 2, 3];
let b = vec![4, 5, 6];

a.extend(&b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
assert_eq!(b, [4, 5, 6]);
9bfwbjaz

9bfwbjaz2#

我不能把它写在一行里。
可以使用chain()在一行中执行此操作:

let c: Vec<i32> = a.into_iter().chain(b.into_iter()).collect(); // Consumed
let c: Vec<&i32> = a.iter().chain(b.iter()).collect(); // Referenced
let c: Vec<i32> = a.iter().cloned().chain(b.iter().cloned()).collect(); // Cloned
let c: Vec<i32> = a.iter().copied().chain(b.iter().copied()).collect(); // Copied

有无数种方法。

zbq4xfa0

zbq4xfa03#

就性能而言,slice::concatappendextend是差不多的,如果你不需要立即得到结果,把它做成一个链式迭代器是最快的;如果您需要collect(),它是最慢的:
第一个

hfwmuf9z

hfwmuf9z4#

我认为连接一个或多个向量的最佳方法是:

let first_number: Vec<usize> = Vec::from([0]);
let final_number: Vec<usize> = Vec::from([3]);
let middle_numbers: Vec<usize> = Vec::from([1,2]);

let numbers = [input_layer, middle_layers, output_layer].concat();
qgelzfjb

qgelzfjb5#

我对MattiaSamiolo answer做了一些修正:

let first_number: Vec<usize> = Vec::from([0]);
            let final_number: Vec<usize> = Vec::from([3]);
            let middle_numbers: Vec<usize> = Vec::from([1, 2]);

            let numbers = [first_number, middle_numbers, final_number].concat();
            println!("{:?}", numbers);

相关问题