在Rust中有可能连接向量吗?如果有,有没有一种优雅的方法可以做到这一点?我有这样的东西:
let mut a = vec![1, 2, 3]; let b = vec![4, 5, 6]; for val in &b { a.push(val); }
有人知道更好的办法吗?
omtl5h9j1#
结构std::vec::Vec具有方法append():
std::vec::Vec
append()
fn append(&mut self, other: &mut Vec<T>)
将other的所有元素移到Self中,并将other保留为空。在您的示例中,以下代码将通过mutatea和b连接两个向量:
other
Self
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)的所有元素附加到一个给定的向量上:
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不会改变:
Copy
extend()
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]);
9bfwbjaz2#
我不能把它写在一行里。可以使用chain()在一行中执行此操作:
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
有无数种方法。
zbq4xfa03#
就性能而言,slice::concat、append和extend是差不多的,如果你不需要立即得到结果,把它做成一个链式迭代器是最快的;如果您需要collect(),它是最慢的:第一个
slice::concat
append
extend
collect()
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();
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);
5条答案
按热度按时间omtl5h9j1#
结构
std::vec::Vec
具有方法append()
:将
other
的所有元素移到Self
中,并将other
保留为空。在您的示例中,以下代码将通过mutate
a
和b
连接两个向量:或者,你可以使用
Extend::extend()
把可以转换成迭代器的东西(比如Vec
)的所有元素附加到一个给定的向量上:注意,向量
b
被移动而不是清空。如果您的向量包含实现Copy
的元素,您可以将对一个向量的不可变引用传递给extend()
,以避免移动。在这种情况下,向量b
不会改变:9bfwbjaz2#
我不能把它写在一行里。
可以使用
chain()
在一行中执行此操作:有无数种方法。
zbq4xfa03#
就性能而言,
slice::concat
、append
和extend
是差不多的,如果你不需要立即得到结果,把它做成一个链式迭代器是最快的;如果您需要collect()
,它是最慢的:第一个
hfwmuf9z4#
我认为连接一个或多个向量的最佳方法是:
qgelzfjb5#
我对MattiaSamiolo answer做了一些修正: