Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1491 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Parcours buffer circulaire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Parcours buffer circulaire

n°643202
Enidan
Posté le 15-02-2004 à 13:49:56  profilanswer
 

Je voudrais parcourir une liste de valeur de façon circulaire.
J'illustre : j'ai les valeurs {A, B, C}.
Je voudrais avoir une fonction qui me renvoie l'élément suivant :
next(A) = B
next(B) = C
next(C) = A
De meme, il me faut une fonction qui me renvoie l'élément précédent :
prev(C) = B
prev(B) = A
prev(A) = C
 
Je précise que ma liste est définie une fois pour toute, cad qu'elle est constante.
 
Pouvez-vous me conseiller sur la "meilleure" façon de faire en C++ ?
 
J'ai pensé à différentes choses.
 
1- Implémenter mes fonctions next et prev avec des switch
=> duplique l'information sur l'ordre des éléments
 
2- Utiliser le type std::list avec un itérateur en faisant un test du genre :

Code :
  1. if (it == l.end()) return l.begin();
  2.    else return ++it;


=> surdimensionné pour mon besoin ?
 
3- Utiliser 2 conteneurs de type std::map, un pour définir les suivants et un pour définir les précédents
=> duplique l'information sur l'ordre des éléments
=> surdimensionné pour mon besoin ?
 
4- Utiliser un tableau :

Code :
  1. TYPE tab[] = {A, B, C};
  2. TYPE next (TYPE val)
  3. {
  4. int i = 0;
  5. while ((i < sizeof(tab)) && (tab[i] != val)) i++
  6. return tab[(i+1)%sizeof(tab)];
  7. }


=> solution qui me plaît le plus mais utilise un tableau C

mood
Publicité
Posté le 15-02-2004 à 13:49:56  profilanswer
 

n°643226
jagstang
Pa Capona ಠ_ಠ
Posté le 15-02-2004 à 14:06:55  profilanswer
 

et plus simplement
 

Code :
  1. TYPE next (TYPE val)
  2.     {
  3.     if (val == 'C')
  4.         return 'A' ;
  5.     return val + 1 ;
  6.     }


 
Pas très beau, mais simple


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°643230
Enidan
Posté le 15-02-2004 à 14:17:28  profilanswer
 

JagStang a écrit :

et plus simplement
 

Code :
  1. TYPE next (TYPE val)
  2.     {
  3.     if (val == 'C')
  4.         return 'A' ;
  5.     return val + 1 ;
  6.     }


 
Pas très beau, mais simple


 
Sauf que je bosse pas sur des caractères, c'était juste pour illustrer le pb.
A+

n°643232
jagstang
Pa Capona ಠ_ಠ
Posté le 15-02-2004 à 14:24:34  profilanswer
 

je crois alors que tu as fais le tour. A moins d'utiliser une structure doublement chainée, tu peux pas faire autrement qu'avec les solutions que tu as citées plus haut
 
a+


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°643240
Enidan
Posté le 15-02-2004 à 14:44:54  profilanswer
 

JagStang a écrit :

je crois alors que tu as fais le tour. A moins d'utiliser une structure doublement chainée, tu peux pas faire autrement qu'avec les solutions que tu as citées plus haut
 
a+


Merci
Par-contre tu ne précises pas laquelle tu me conseilles ?

n°643476
Enidan
Posté le 15-02-2004 à 20:31:52  profilanswer
 

:bounce:  
C'est pour apprendre les bonnes pratiques !

n°643486
Taz
bisounours-codeur
Posté le 15-02-2004 à 20:35:36  profilanswer
 

moi j'aime bien le concept de sous-type/enrobeur (voir même quelque chose de mixte) d'iterator pour planquer tout ça joliment

n°643513
Enidan
Posté le 15-02-2004 à 21:10:58  profilanswer
 

taz a écrit :

moi j'aime bien le concept de sous-type/enrobeur (voir même quelque chose de mixte) d'iterator pour planquer tout ça joliment


Un type dérivé de std::list en redéfinissant iterator ?
Ou plus simple que ça ?

n°643514
Taz
bisounours-codeur
Posté le 15-02-2004 à 21:20:30  profilanswer
 

non, juste une surcouche par dessus un itérateur
soit par héritage, soit pas enrobbage
 
soit un simple object fonction
 

Code :
  1. TourneEnRond< std::list<int> > inc(liste);
  2. std::list<int>::iterator it(liste.begin());
  3. while( ... )
  4. {
  5.    inc(it);
  6. }


Message édité par Taz le 15-02-2004 à 21:20:45
n°643652
Enidan
Posté le 16-02-2004 à 00:14:22  profilanswer
 

Peux-tu montrer ce que tu ferais par héritage ?
J'essaie de faire un template qui hérite de T::iterator, mais je ne sais pas comment récupérer une référence sur le conteneur pour pouvoir tester end().
J'ai tout faux ?

mood
Publicité
Posté le 16-02-2004 à 00:14:22  profilanswer
 

n°643714
Taz
bisounours-codeur
Posté le 16-02-2004 à 13:07:35  profilanswer
 

pas question d'hériter du conteneur, mais peut être juste de l'itérateur avec un héritage template. tu peux pas récupére la référence, voire plus haut

n°644951
Enidan
Posté le 17-02-2004 à 09:32:13  profilanswer
 

taz a écrit :

pas question d'hériter du conteneur, mais peut être juste de l'itérateur avec un héritage template. tu peux pas récupére la référence, voire plus haut


Peux-tu développer STP ?
C'est ce que j'ai essayé de faire donc y a qqch qui m'échappe.
 
A+


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Parcours buffer circulaire

 

Sujets relatifs
Algorithme de parcours[ASP] Récupérer le contenu du buffer
[Prog. en général] Question fondamentale sur le parcours d'un doc[Sql] Buffer overflow
DirectShow - J'ai un buffer, je voudrais un bitmapCopie de buffer dans formulaire de saisie de msg
comment vider le buffer d'évenement ListSelectionEvent[open gl] Enlevement de matiere avec Z buffer en temps réel
Buffer, fichier, read et fread[ALGO]parcours total d'un tableau en 3d [update projet fini]
Plus de sujets relatifs à : Parcours buffer circulaire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR