IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Rust Discussion :

Permuter deux éléments d'un vecteur


Sujet :

Rust

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Par défaut Permuter deux éléments d'un vecteur
    Bonjour.

    Je me pose une question simple, quels sont les moyens de permuter deux éléments d'un vecteur. Classiquement on peut écrire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    fn main() {
     
        let mut tab = vec!["bli", "bla", "blou"];
        println!("Avant permutation: {:#?}", &tab);
     
        inter(&mut tab, 0usize, 2usize);
        println!("Après permutation: {:#?}", &tab);
     
    }
     
    fn inter( tab: &mut Vec<&str>, idx_a: usize, idx_b: usize) {
        let tmp = tab[ idx_a ];
        tab[ idx_a ] = tab[ idx_b ];
        tab[ idx_b ] = tmp; 
    }
    Quels sont les autres façons d'écrire ce genre de choses et si vous voyez des avantages ou faiblesse de telle ou telle méthode ?

    PS : Je suis débutant en Rust.

  2. #2
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 515
    Par défaut
    Bonjour,

    Pour permuter deux éléments d'un vecteur, Rust offre déjà une méthode swap :
    Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fn main() {
     
        let mut tab = vec!["bli", "bla", "blou"];
        println!("Avant permutation: {:#?}", &tab);
     
        tab.swap(0, 2);
        println!("Après permutation: {:#?}", &tab);
     
    }
    Un avantage de cette méthode swap est qu'elle marche aussi pour des types comme String qui n'implémentent pas le trait Copy :
    Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fn main() {
     
        let mut tab = vec![String::from("bli"), String::from("bla"), String::from("blou")];
        println!("Avant permutation: {:#?}", &tab);
     
        tab.swap(0, 2);
        println!("Après permutation: {:#?}", &tab);
     
    }
    Alors que, si on essayait ton code sur un Vec<String> :
    Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    fn main() {
     
        let mut tab = vec![String::from("bli"), String::from("bla"), String::from("blou")];
        println!("Avant permutation: {:#?}", &tab);
     
        inter(&mut tab, 0usize, 2usize);
        println!("Après permutation: {:#?}", &tab);
     
    }
     
    fn inter( tab: &mut Vec<String>, idx_a: usize, idx_b: usize) {
        let tmp = tab[ idx_a ];
        tab[ idx_a ] = tab[ idx_b ];
        tab[ idx_b ] = tmp; 
    }
    On aurait des erreurs de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    error[E0507]: cannot move out of index of `Vec<String>`
      --> src/main.rs:12:15
       |
    12 |     let tmp = tab[ idx_a ];
       |               ^^^^^^^^^^^^
       |               |
       |               move occurs because value has type `String`, which does not implement the `Copy` trait
       |               help: consider borrowing here: `&tab[ idx_a ]`
     
    error[E0507]: cannot move out of index of `Vec<String>`
      --> src/main.rs:13:20
       |
    13 |     tab[ idx_a ] = tab[ idx_b ];
       |                    ^^^^^^^^^^^^ move occurs because value has type `String`, which does not implement the `Copy` trait
     
    For more information about this error, try `rustc --explain E0507`.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Par défaut
    Bonjour Pyramidev.

    Merci pour votre réponse détaillé !

    En effet, la méthode swap semble bien plus optimal.

Discussions similaires

  1. Permuter deux variables sans variable temporaire
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/01/2015, 08h02
  2. permutation de deux éléments et recalcul de leur somme
    Par sophielow dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 15/12/2013, 11h41
  3. onclick sur deux éléments superposés et IE6
    Par sovitec dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/12/2005, 13h56
  4. Permutation des éléments d'un CStringArray
    Par TigreRouge dans le forum MFC
    Réponses: 1
    Dernier message: 22/08/2005, 20h45
  5. Réponses: 1
    Dernier message: 13/07/2005, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo