2015-06-05 15 views
7

Trong Rust, có một chức năng được xây dựng để tìm và loại bỏ các phần tử của một véc tơ, cả đồng thời và dưới dạng các hành động riêng biệt?Có thể tìm thấy một phần tử trong một Vec <T> và xóa nó không?

Ví dụ:

for f in factors { 
    if f in list { 
     list.remove(f); 
    } 
} 

Hiện nay, tài liệu gỉ vẫn còn một chút bối rối, vì vậy trong khi tìm kiếm của tôi như thể hiện lên gì cả, tôi cảm thấy như có một cơ hội tốt người khác có thể đã tìm thấy nó.

Trả lời

7

Ví dụ có thể được viết như sau:

let mut list = (0..10).collect::<Vec<u32>>(); 
list.retain(|element| element % 2 == 0); 
assert_eq!(&list[..], &[0, 2, 4, 6, 8]); 

Các tài liệu liên quan có thể tìm thấy ở đây: https://doc.rust-lang.org/std/vec/struct.Vec.html

+0

Ah thú vị, nó thay đổi sự tập trung mà có lẽ lý do tại sao việc tìm kiếm nó có thể khó khăn. –

+0

Tuyệt vời. Cảm ơn vì điều đó! –

4

Bạn luôn có thể sử dụng một into_iter() để destructure các Vec thành một iterator, filter(..) rằng đối với phần tử và collect() thành một Vec mới:

list.into_iter().filter(|e| !factors.contains(e)).collect(); 

Bạn có thể cần phải xác định loại thu thập (mà phải được Vec < T> trong đó T là loại phần tử của bạn) trừ khi bạn liên kết nó thành một biến đúng loại.

Chỉnh sửa: Sau lời khuyên A.B., bạn cũng có thể viết

list.retain(|e| !factors.contains(e)) 

Lưu ý rằng cả hai sẽ nằm trong O (L × F) trong đó L là len của list và F các len của factors. Đối với L nhỏ và/hoặc F, điều này sẽ ổn. Nếu không thì tốt hơn là nên chuyển đổi các thừa số thành một HashSet trước.

2

Không có phương pháp "tìm và xóa" đồng thời mà tôi biết. Vec có:

  • remove là phương pháp tổng quát để loại bỏ một phần tử và thay đổi tất cả những người mà theo để lấp đầy khoảng trống
  • swap_remove loại bỏ yếu tố này và thay thế bằng người cuối cùng (tránh tất cả các chuyển dịch, vì vậy nó thường nhanh hơn)
  • pop loại bỏ các yếu tố cuối cùng (rất hiệu quả, có thể không phải những gì bạn cần nếu bạn muốn loại bỏ một phần tử trong giữa Vec)

bạn có thể làm somethin g như:

let mut v = vec![1, 2, 3]; 
// iterate through the vector and return the position for the 
// first element == 2. If something is found bind it to the name 
// index 
if let Some(index) = v.iter().position(|&i| i == 2) { 
    v.remove(index); // remove the element at the position index (2) 
} 

println!("{:?}", v); // prints [1, 3] 
Các vấn đề liên quan