2014-10-07 40 views
6

Có cách nào đơn giản để xóa phần tử khỏi một số Vec<T> không?Xóa phần tử khỏi một vector

Có một phương pháp gọi là remove() và phải mất index: usize, nhưng thậm chí không có phương thức index_of() mà tôi có thể xem.

Tôi đang tìm kiếm thứ gì đó (hy vọng) đơn giản và O (n).

Trả lời

10

Đây là những gì tôi đã đưa ra cho đến nay (mà cũng làm cho kiểm tra mượn hạnh phúc):

let index = xs.iter().position(|x| *x == some_x).unwrap(); 
xs.remove(index); 

tôi vẫn chờ đợi để tìm một cách tốt hơn để làm điều này vì điều này là khá xấu xí.

Lưu ý: mã của tôi giả định phần tử không tồn tại (do đó là .unwrap()).

+0

Lưu ý rằng stdlib vẫn đang được thiết kế, vì vậy nó có thể thiếu một số chức năng phổ biến ở các ngôn ngữ khác. Cảm thấy tự do để gửi một PR thêm này! – aochagavia

7

Có một phương thức position() cho trình lặp mà trả về chỉ mục của phần tử đầu tiên khớp với vị từ. câu hỏi liên quan: Is there an equivalent of JavaScript's indexOf for Rust arrays?

Và một ví dụ mã:

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

    println!("Before: {:?}", vec); 

    let removed = vec.iter() 
     .position(|&n| n > 2) 
     .map(|e| vec.remove(e)) 
     .is_some(); 

    println!("Did we remove anything? {}", removed); 

    println!("After: {:?}", vec); 
} 
+1

này không biên dịch.. unwrap()); '-" không thể mượn 'xs' là không thay đổi được vì nó cũng được mượn là có thể thay đổi" –

+1

@Kai Sellgren: Còn được gọi là: không sửa đổi vùng chứa bạn đang lặp lại. –

4

Bạn có thể sử dụng retain method nhưng nó sẽ xóa tất cả các thể hiện của giá trị:

fn main() { 
    let mut xs = vec![1, 2, 3]; 
    let some_x = 2; 
    xs.retain(|&x| x != some_x); 
    println!("{:?}", xs); // prints [1, 3] 
} 
+0

Việc so sánh được thực hiện sau khi các yếu tố được tìm thấy là không cần thiết – malbarbo

+1

@malbarbo Có, điều này là bởi vì phương pháp này loại bỏ mọi trường hợp của giá trị. – antoyo

5

Có một API thực nghiệm, được gọi là Vec::remove_item(). Nó vẫn không ổn định, vì vậy nó không thể sử dụng được với trình biên dịch ổn định. Nhưng cuối cùng nó sẽ được ổn định (tracking issue). vị trí 'xs.remove (xs.iter() (| x | * x == some_x):

Với phương pháp đó, làm những gì bạn muốn thực sự là dễ dàng:

let removed = xs.remove_item(&some_x); 
Các vấn đề liên quan