web-dev-qa-db-fra.com

Supprimer un élément d'un vecteur

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).

24
Kai Sellgren

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()).

24
Kai Sellgren

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]
}
17
antoyo

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); 
11
Lukas Kalbertodt

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);
}
10
A.B.