stl iterator

stl iterator - C++ - Programmation

Marsh Posté le 10-03-2009 à 15:23:20    

Hi,
 
A priori les iterator son sensés être une abstraction des pointeurs, aussi je me demandais  
pour quelle raison est ce que la définition des itérateurs dans les fichiers de la stl, est-elle spécialisée pour le type pointeur??
 
Merci

Reply

Marsh Posté le 10-03-2009 à 15:23:20   

Reply

Marsh Posté le 10-03-2009 à 15:26:31    

Tu parles de quoi exactement ?

Reply

Marsh Posté le 10-03-2009 à 15:37:44    

En faite j'essaye de comprendre l'intérêt d'avoir spécialisé la classe template iterator pour le type pointeur. ça me parait contre intuitif dans la mesure où les iterators sont sensés être une abstraction des pointeurs. d'où mon interrogation, si il existe une une classe template spécialisé pour le type pointeur, pour quelle type de donnée la classe template non spécialisé peut-elle servir ? des objets peuvent donc être utilisés comme des pointeurs sans en être réellement ?
 
Peut être ce que je ne comprends pas finalement c'est ce qu'on entends par 'abstraction des pointeurs' (et surtout sa finalité)
 
Correction:  oui en faite c'est la classe iterator_traits qui est spécialisé pour le type pointeur, mais je pense pas que ça change beaucoup de choses à ma question


Message édité par weblook$$ le 10-03-2009 à 16:16:29
Reply

Marsh Posté le 10-03-2009 à 17:02:01    

Mais les traits ça n'a rien à voir, tu peux pas regarder une classe au pif et dire sans la comprendre "elle est pas normale". iterator_traits, ça permet justement de faire un pont entre iterator et pointeurs ...


Message édité par Taz le 10-03-2009 à 17:12:30
Reply

Marsh Posté le 10-03-2009 à 17:17:57    

Peut être qu'une question qui pourrait me faire avancer dans mon degré de compréhension du couple iterator/iterator_traits serait la suivante:

 

Pourquoi y a t-il une spécialisation de la classe iterator_traits pour le type pointeur?

 

ce qui m'aurait semblé logique est l'implémentation suivante:  Une classe iterator_traits en tout est pour tout servant un décrire un pointeur sur un type T donné.

 

Hors là il y a une classe iterator_traits pour les types qui ne sont pas des pointeurs. Dans la mesure ou les iterateurs généralisent la notion de pointeurs, ça me laisse un peu perplexe qu'il soit nécéssaire de faire un tel distinguo


Message édité par weblook$$ le 10-03-2009 à 17:18:25
Reply

Marsh Posté le 10-03-2009 à 17:25:11    

Tu as regarde ce que fait le cas non specialise?  Est-ce qu'il a du sens pour des pointeurs?  Est-ce que le cas specialise a du sens pour des pointeurs?

Reply

Marsh Posté le 10-03-2009 à 18:36:36    

Tu as regarde ce que fait le cas non specialise?  Est-ce qu'il a du sens pour des pointeurs?

 

bah ui je pense :

 
Code :
  1. template <class Category,
  2.     class T, class Distance = ptrdiff_t,
  3.     class Pointer = T*, class Reference = T &>
  4. struct iterator
  5. {
  6.     typedef T         value_type;
  7.     typedef Distance  difference_type;
  8.     typedef Pointer   pointer;
  9.     typedef Reference reference;
  10.     typedef Category  iterator_category;
  11. };
  12. template <class Iterator>
  13. struct iterator_traits
  14. {
  15.     typedef Iterator::value_type        value_type;
  16.     typedef Iterator::difference_type   difference_type;
  17.     typedef Iterator::pointer           pointer;
  18.     typedef Iterator::reference         reference;
  19.     typedef Iterator::iterator_category iterator_category;
  20. };
 

je vois pas ce qui clocherais en faite, pour le type Iterator::pointer on a bien un T*


Message édité par weblook$$ le 10-03-2009 à 19:43:28
Reply

Marsh Posté le 10-03-2009 à 20:47:11    

1/ C'est quel compilateur que tu utilises (il manque des typenames pour avoir un code conforme)?
2/ Si tu instancies la version non spécialisée avec int*, elle ne fait que définir des typedefs, et des typedefs du genre:
 
typedef int*::value_type valuetype;
 
chez moi, ça n'a pas de sens.

Reply

Marsh Posté le 11-03-2009 à 00:48:35    

Oui je me suis trompé dans les copier coller, j'ai pris ça d'un site par facilité, effectivement tes remarques sont justes.

 

Ok je vois bien le soucis si pas de spécialisation.

 

Dans l'expression
typedef Iterator::pointer  pointer;

 

Iterator peut être un int donc ? Si oui int::value_type ça existe ? Si non, et si ça n'est pas un pointeur, quel peut être le type d'Iterator ?

 

Message cité 1 fois
Message édité par weblook$$ le 11-03-2009 à 09:56:59
Reply

Marsh Posté le 11-03-2009 à 11:09:09    

weblook$$ a écrit :

Iterator peut être un int donc ? Si oui int::value_type ça existe ? Si non, et si ça n'est pas un pointeur, quel peut être le type d'Iterator ?

Cette classe, elle est faite pour tous les T qui respectent un protocole, et elle est spécialisée pour les T*. Si tu l'utilises sur un T qui ne respecte pas le protocole, ça ne compile plus.

Reply

Marsh Posté le 11-03-2009 à 11:09:09   

Reply

Marsh Posté le 11-03-2009 à 11:46:36    

Ok je vois un peu mieux merci !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed