2015-06-05 7 views
7

Czy w Rust istnieje wbudowana funkcja znajdowania i usuwania elementów wektora, zarówno jednocześnie, jak i osobno?Czy można znaleźć element w Vec <T> i go usunąć?

Na przykład:

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

Obecnie dokumentacja rdza jest jeszcze odrobinę mylące, więc podczas wyszukiwania moja jak pokazano się nic, czuję się jak tam jest duża szansa, ktoś inny mógł go znaleźć.

Odpowiedz

7

Przykładem może być zapisany jako:

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

Stosowna dokumentacja można znaleźć tutaj: https://doc.rust-lang.org/std/vec/struct.Vec.html

+0

Ah interesujący, przesuwa ostrość i pewnie dlatego znalezienie go może być trudne. –

+0

Awesome. Dziękuję za to! –

4

Zawsze możesz użyć into_iter() do destructure VEC do iteratora, filter(..) że dla elementu i collect() do nowego Vec:

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

może trzeba określić typ honor (która powinna być Vec < T> gdzie T jest typem twojego elementu), chyba że powiążesz go ze zmienną odpowiedniego typu.

Edycja: Po poradę A.B. użytkownika, można również napisać

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

Należy zauważyć, że zarówno wewnątrz byłoby O (L × F) gdzie L jest len ​​od list i F len z factors. Dla małych L i/lub F wszystko będzie dobrze. W przeciwnym razie lepiej najpierw przekonwertować czynniki na HashSet.

2

Nie ma równoczesnej metody "znajdowania i usuwania", którą znam. vec posiada:

  • remove jest ogólny sposób, aby usunąć element i przenieść wszystkie te, które następują, aby wypełnić lukę
  • swap_remove usunąć ten element i zastąpić ją ostatni (eliminuje wszelkie przesunięcie, tak to zazwyczaj szybciej)
  • pop usuwa ostatni element (bardzo skuteczny, nie może być to, czego potrzebujesz, jeśli chcesz usunąć element w środku Vec)

można zrobić coś g jak:

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] 
Powiązane problemy