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 :

collections: listes chaînées -- comment passer à l'élément suivant [Cargo]


Sujet :

Rust

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 330
    Par défaut collections: listes chaînées -- comment passer à l'élément suivant
    Bonjour,

    Je suis dubitatif quant à la manière dont Rust (std::collections::LinkedList) gère les listes chaînées...
    En général, en tous cas, moi je passe par des listes chaînées quand je dois, par exemple, "populer" des éléments d'un menu dans lequel on ne doit choisir "un élément".

    Dans mon application j'ai une liste chaînée qui contient des strings, mon prompt gère les "key strokes" et compare le contenu du "prompt" avec les éléments de la liste qui commencent par le prompt et propose de "complèter" le prompt avec les propositions contenues dans la liste chaînée.
    Avec la touche "down" l'utilisateur va "switcher" lorsqu'il existe plusieurs propositions... dans le sens head -> tail et avec "up" dans le sens tail -> head.

    Le soucis c'est que ça ne fonctionne que dans un sens... dans la solution actuelle pour passer à l'élément suivant dans la liste je dois faire un pop() :{

    Par exemple: ceci ne fonctionne pas, j'ai TOUJOURS le même élément...

    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
    17
    18
    19
    20
    loop 
    	{
    		let mut iteratoroutoffor = malistechaînée.iter();
    		let chaine = iteratoroutoffor.next();																				// ne PASSE JAMAIS AU SUIVANT !! C'est de la merde !!!
     
    		if chaine.is_some()
    		{
    			println!("loop {}",chaine.unwrap());
    		}
    		else 
    		{  
    			break;
    		}
    		compteur+=1;
    		if compteur == malistechaînée.len()
    		{
    			println!("C'EST DE LA MERDE !!!");
    			break;
    		}
    	}

    De 1: c'est bien beau d'avoir un itérateur mais franchement je trouve plus logique d'avoir un pointeur next et previous pour chaque élément de la liste chaînée... devoir taper un iter.rev() c'est vraiment merdique d'autant que il ne semble pas possible de le modifier une fois dans la boucle...
    De 2: c'est bien beau d'indiquer dans la doc que iter.next() passe à l'élément suivant si en fait il ne le fait pas...
    ...et dans le cas de la volonté de parcourir du tail au head on fait comment ? next() dans mon esprit c'est toujours de head à tail... de tail à head c'est previous cela me semble logique surtout si on se réfère aux adresses des éléments en mémoire...

    Nom : debug_linkedlist000.png
Affichages : 165
Taille : 219,9 Ko

    Dans ce snapshot les deux premières boucles sont des boucles for où je ne fais pas d'appel explicite à iter.next()... la dernière est une loop dans laquelle j'appelle iter.next()... qui ne renvoie pas l'élément suivant et reste donc bouclé sur lui-même...

  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
    Citation Envoyé par hurukan Voir le message
    Dans mon application j'ai une liste chaînée qui contient des strings, mon prompt gère les "key strokes" et compare le contenu du "prompt" avec les éléments de la liste qui commencent par le prompt et propose de "complèter" le prompt avec les propositions contenues dans la liste chaînée.
    Avec la touche "down" l'utilisateur va "switcher" lorsqu'il existe plusieurs propositions... dans le sens head -> tail et avec "up" dans le sens tail -> head.

    Le soucis c'est que ça ne fonctionne que dans un sens... dans la solution actuelle pour passer à l'élément suivant dans la liste je dois faire un pop() :{
    Bonjour,

    pop_front et pop_back vont retirer des éléments de ta liste.

    Avec iter, la liste restera intacte. Mais le problème d'un itérateur est qu'il ne revisite pas les éléments qu'il a déjà parcourus. C'est un peu comme une fenêtre qui ne fait que se rétrécir. Chaque appel à next va rétrécir la fenêtre à "gauche" et chaque appel à next_back va rétrécir la fenêtre à "droite".

    En Rust stable, std::collections::LinkedList ne supporte pas encore les curseurs (comme std::collections::linked_list::Cursor) qui permettent de naviguer librement dans la liste doublement chaînée.

    Mais les listes chaînées sont très rarement pertinentes. Comme le dit la documentation : « NOTE: It is almost always better to use Vec or VecDeque because array-based containers are generally faster, more memory efficient, and make better use of CPU cache. »

    Dans ton cas, il serait plus pertinent d'avoir un Vec et de manipuler un indice à la place d'un itérateur. Comme ça, tu pourras facilement incrémenter ou décrémenter cet indice.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 330
    Par défaut
    Argh !!

    Je voulais me la peter moi :{
    Frustré je vais changer la LinkedList en Vec... ^^

  4. #4
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 330
    Par défaut
    oui... en relisant convenablement mes instructions après avoir bien nettoyé mes lunettes... je me suis rendu compte que

    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
    let mut iteratoroutoffor = malistechaînée.iter();
    loop 
    {
     
      let chaine = iteratoroutoffor.next();																				
     
      if chaine.is_some()
      {
    	println!("loop {}",chaine.unwrap());
      }
      else 
      {  
    	break;
     }
    }
    ...fonctionne mieux...
    Entre temps mon application avec Vec fonctionne parfaitement (mis à part le terminal qui n'affiche pas les caractères utf8 et utf16 convenablement sous windows mais ça va aller)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/12/2007, 18h06
  2. Réponses: 1
    Dernier message: 18/09/2007, 13h58
  3. [JavaScript] [FAQ][correction] Comment passer automatiquement au champ suivant
    Par Auteur dans le forum Contribuez
    Réponses: 10
    Dernier message: 14/12/2006, 18h18
  4. Réponses: 4
    Dernier message: 12/05/2006, 11h08
  5. Etat : comment passer à la page suivante
    Par Celia1303 dans le forum Access
    Réponses: 2
    Dernier message: 26/10/2005, 16h45

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