2016-11-24 21 views
6

Thậm chí có thể ghép các vec tơ trong Rust không? Nếu vậy, có một cách thanh lịch để làm như vậy? Tôi có nội dung như sau:Cách tốt nhất để ghép các vec tơ trong Rust

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

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

Có ai biết cách nào tốt hơn không?

+1

liên quan, có thể trùng lặp: [? Cách thành ngữ để nối thêm một lát để một vector là gì] (http://stackoverflow.com/q/29998515/464709) –

+1

Mã trong câu hỏi của bạn không biên dịch. – bluss

+1

Bạn có thể cụ thể hơn không? Bạn có muốn tạo ra một véc tơ bằng cách tiêu thụ một véc tơ khác, hoặc chỉ có một trình lặp qua kết nối không? –

Trả lời

14

Cấu trúc std::vec::Vec có phương pháp append():

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

Chuyển tất cả các yếu tố của other vào Self, để lại other trống.

Từ ví dụ của bạn, đoạn code sau sẽ nối hai vectơ bởi đột biếnab:

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, []); 
} 

Ngoài ra, bạn có thể sử dụng Extend::extend() để thêm tất cả các yếu tố của một cái gì đó mà có thể biến thành một trình lặp (như Vec) thành một vectơ đã cho:

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 

Lưu ý rằng véc tơ b được di chuyển thay vì làm trống. Nếu các vectơ của bạn chứa các phần tử thực hiện Copy, bạn có thể chuyển một tham chiếu bất biến tới một vector tới extend() thay vì để tránh di chuyển. Trong trường hợp đó vector b là không thay đổi:

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

Ahh, tôi không thấy điều đó. Cảm ơn! Đây là hoàn hảo. –

Các vấn đề liên quan