生锈中加和矢量的最佳方法是什么?

问题描述 投票:0回答:6
甚至有可能在生锈中加入矢量吗?如果是这样,是否有一种优雅的方式?我有这样的东西:

let mut a = vec![1, 2, 3]; let b = vec![4, 5, 6]; for val in &b { a.push(val); }
有人知道一种更好的方法吗?

vector rust concatenation
6个回答
304
投票
结构

std::vec::Vec

具有方法
append()

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

将所有元素的所有元素转化为

other
,留下
Self
空。
从您的示例中,以下代码将通过

Mutating

other

a
,您可以使用

b

将可以将迭代器(例如

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()

我不能一行。 damiandziaduch

107
投票
可以通过使用

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]);

有无限的方式。
    
themand the the绩效,

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

48
投票
slice::concat

大致相同。如果您不需要立即结果,则将其成为最快的迭代器。如果您需要append

,那是最慢的:
extend
collect()
    
我认为连接一个或多个向量的最佳方法是:

#![feature(test)]

extern crate test;

use test::Bencher;

#[bench]
fn bench_concat___init__(b: &mut Bencher) {
    b.iter(|| {
        let mut x = vec![1i32; 100000];
        let mut y = vec![2i32; 100000];
    });
}

#[bench]
fn bench_concat_append(b: &mut Bencher) {
    b.iter(|| {
        let mut x = vec![1i32; 100000];
        let mut y = vec![2i32; 100000];
        x.append(&mut y)
    });
}

#[bench]
fn bench_concat_extend(b: &mut Bencher) {
    b.iter(|| {
        let mut x = vec![1i32; 100000];
        let mut y = vec![2i32; 100000];
        x.extend(y)
    });
}

#[bench]
fn bench_concat_concat(b: &mut Bencher) {
    b.iter(|| {
        let mut x = vec![1i32; 100000];
        let mut y = vec![2i32; 100000];
        [x, y].concat()
    });
}

#[bench]
fn bench_concat_iter_chain(b: &mut Bencher) {
    b.iter(|| {
        let mut x = vec![1i32; 100000];
        let mut y = vec![2i32; 100000];
        x.into_iter().chain(y.into_iter())
    });
}

#[bench]
fn bench_concat_iter_chain_collect(b: &mut Bencher) {
    b.iter(|| {
        let mut x = vec![1i32; 100000];
        let mut y = vec![2i32; 100000];
        x.into_iter().chain(y.into_iter()).collect::<Vec<i32>>()
    });
}


23
投票

对Mattia Samiolo的
andswer

0
投票

-3
投票

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();

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.