Existe-t-il un moyen simple de supprimer un élément d'un Vec<T>
?
Il y a une méthode appelée remove()
, et cela prend un index: usize
, Mais il n'y a même pas de méthode index_of()
que je puisse voir.
Je cherche quelque chose (espérons-le) simple et O (n).
Voici ce que j'ai trouvé jusqu'à présent (cela rend également le vérificateur d'emprunt heureux):
let index = xs.iter().position(|x| *x == some_x).unwrap();
xs.remove(index);
J'attends toujours de trouver une meilleure façon de faire car c'est assez moche.
Remarque: mon code suppose que l'élément existe (d'où la .unwrap()
).
Vous pouvez utiliser la méthode retain
mais cela supprimera toutes les instances de la valeur:
fn main() {
let mut xs = vec![1, 2, 3];
let some_x = 2;
xs.retain(|&x| x != some_x);
println!("{:?}", xs); // prints [1, 3]
}
Il existe une API expérimentale, appelée Vec::remove_item()
. Il est toujours instable, il n'est donc pas utilisable avec le compilateur stable. Mais il finira probablement par se stabiliser ( problème de suivi ).
Avec cette méthode, faire ce que vous voulez est vraiment facile:
let removed = xs.remove_item(&some_x);
Il existe une méthode position()
pour les itérateurs qui retourne l'index du premier élément correspondant à un prédicat. Question connexe: Existe-t-il un équivalent de indexOf
de JavaScript pour Rust tableaux)?
Et un exemple de code:
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);
}