2015-06-05 11 views
7

In Rust, esiste una funzione incorporata per la ricerca e la rimozione di elementi di un vettore, sia simultaneamente che come azioni separate?E 'possibile trovare un elemento in un Vec <T> e rimuoverlo?

Ad esempio:

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

Attualmente, la documentazione di ruggine è ancora un po 'di confusione, così mentre la mia ricerca come mostrato a nulla, mi sento come se c'è una buona possibilità che qualcun altro potrebbe aver trovato.

risposta

7

L'esempio può essere scritta come:

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

La relativa documentazione può essere trovato qui: https://doc.rust-lang.org/std/vec/struct.Vec.html

+0

Ah interessante, sposta l'attenzione che è probabilmente il motivo per trovare esso potrebbe essere difficile –

+0

Fantastico. Grazie per quello! –

4

Si può sempre usare un into_iter() di destrutturare il Vec in un iteratore, filter(..) che per l'elemento e collect() in un nuovo Vec:

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

potrebbe essere necessario specificare il tipo di raccolta (che dovrebbe essere Vec T> dove T è il tipo di elemento) a meno che non lo si leghi in una variabile del tipo corretto.

Edit: Seguendo il consiglio di A.B., si potrebbe anche scrivere

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

Nota che entrambi sarebbero all'interno di O (L × F) dove L è la len di list e F la len di factors. Per piccoli L e/o F, questo andrà bene. Altrimenti potrebbe essere meglio convertire prima i fattori in un HashSet.

2

Non esiste un metodo "trova e rimuovi" simultaneo, che io conosca. Vec ha:

  • remove è il metodo generale per rimuovere un elemento e spostare tutti quelli che seguono per riempire il vuoto
  • swap_remove rimuovere questo elemento e sostituirlo con l'ultimo (evita tutto lo spostamento, in modo è generalmente più veloce)
  • pop rimuove l'ultimo elemento (molto efficiente, potrebbe non essere quello che vi serve se si desidera rimuovere un elemento al centro del Vec)

si potrebbe fare qualcosa g come:

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] 
Problemi correlati