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

  FORUM HardWare.fr
  Programmation
  C++

  unifier les itérateurs ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

unifier les itérateurs ...

n°1396797
zzegod
Posté le 28-06-2006 à 18:33:33  profilanswer
 

Bonjour,
 
J'essaye d'unifier différents types d'itérateurs afin de simplifier l'interface de plusieurs classes containers. Concrètement, voici (en essence) ce que j'ai tenté :
 

Code :
  1. class A {...};
  2. typedef std::iterator<std::bidirectional_iterator_tag, A> A_iterator;
  3. class B {
  4. private:
  5.   std::vector<A> v;
  6.   std::set<A> s;
  7. public:
  8.   A_iterator v_begin() {return v.begin();}
  9.   ...
  10.   A_iterator s_end() {return s.end();}
  11. };


 
Dans le but de remplacer les vector<A>::iterator et set<A>::iterator par des A_iterator (unification pour l'utilisateur, et encapsulation qui fait que l'utilisateur n'a pas besoin de savoir qu'un B est implémenté par un vector+set pour s'y promener ...)
 
Malheureusement, le compilo refuse de caster le type d'itérateur retourné par v.begin() en un A_iterateur, même explicitement.
 
Une idée, un conseil, une astuce (voire soluce) ?
 
Merci d'avance !
 
-- ZZ

mood
Publicité
Posté le 28-06-2006 à 18:33:33  profilanswer
 

n°1396835
skelter
Posté le 28-06-2006 à 19:47:31  profilanswer
 

meme si tu pouvais je vois pas l'interet, montre un exemple de code appelant souhaité

n°1396844
_darkalt3_
Proctopathe
Posté le 28-06-2006 à 19:57:11  profilanswer
 

tu veux passer un iterateur générique d'un conteneur générique en itérateur typé ? ca ne serait pas une regression ?


Message édité par _darkalt3_ le 28-06-2006 à 19:57:27

---------------
Töp of the plöp
n°1396855
skelter
Posté le 28-06-2006 à 20:12:51  profilanswer
 

je penses qu'il veut faire
B::iterator i = <b.v_begin() ou b.s_begin()>;
 
mais bon c'est pas comme ca qu'on fait, suffit de voir les algorithmes standard, tout ce qu'on attend d'un iterateur c'est d'avoir l'interface d'un pointeur et apres c'est template & co qui genere du code avec des ++ et des * pour les algos génériques
 
suffit de faire
mon_algo(<b.v_begin() ou b.s_begin()>, ...);
et ca roule

n°1396860
Taz
bisounours-codeur
Posté le 28-06-2006 à 20:28:00  profilanswer
 

tu peux facilement faire un petit iterator d'emballage par dessus. le plus petit commun étant le forward iterator il me semble, en généralisant, tu perds en fonctionnalités (pas d'accès aléatoire sur le set)

n°1396876
zzegod
Posté le 28-06-2006 à 21:01:33  profilanswer
 

skelter a écrit :

meme si tu pouvais je vois pas l'interet, montre un exemple de code appelant souhaité


 
Dans l'idée, il s'agit juste d'avoir un type itérateur (paramétré par le type d'élement "pointé" par l'itérateur) :
 

Code :
  1. template < class D > class bi_iterator : public std::iterator<std::bidirectional_iterator_tag, D>{};


 
qui remplace (ou encapsule) n'importe quel itérateur de containers.
 
Intuitivement, je sens bien que ça coince car il faut faire correspondre les opérations sur les bi_iterator (++, *, etc.) avec les mêmes opérations sur des types d'itérateurs différents qui sont "implementation defined" (dixit la doc STL), mais n'y-a-t'il pas un moyen autre de parvenir à mes fins ?
 
Un exemple d'appli : construire une structure de graphe et utiliser des itérateurs sur les noeuds et les arêtes que l'utilisateur puisse utiliser sans avoir besoin de savoir que le graphe est implémenté par des set ou des vector ou encore des list ... vous allez me dire : suffit de faire des itérateurs de la classe graphe, mais si d'autres classes stockent aussi des noeuds ou des arêtes, j'aimerais qu'elles utilisent les mêmes itérateurs !
 
-- ZZ

n°1396918
Taz
bisounours-codeur
Posté le 28-06-2006 à 22:44:22  profilanswer
 

et bien défini ton propre itérateur. j'ai écris un petit truc dessus dans les sujets utiles si je me souviens.


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

  unifier les itérateurs ...

 

Sujets relatifs
[C++] les iterateurs STL[C,C++] de l'utilisation des iterateurs avec la STL ??
Plus de sujets relatifs à : unifier les itérateurs ...


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)