iterator est un type membre de std::vector, il me semble meme que
d'apres la specification de vector faite par le standard on peu penser
que c'est un alias de T*.
fais une recherche et positionnes toi au debut de la declaration de la
classe vector, puis a partir de la fait une recherche sur iterator,
etant donnée que le standard garanti que les données d'un vector sont
continues, je suis a peu pres sur que tu dois avoir
template <classe _Tp, ...>
class vector ...
{
typedef _Tp * iterator; // tout simplement, c'est ce que j'ai avec devcpp
}
tu as quoi exactement ?
ps: j'ai déja lu mon implémentation de std::vector, c'est vrai que
c'est rebutant mais en realité ca reste facile à lire par rapport à
d'autres classes de la stl et ca permet vraiment de bien comprendre
comment fonctionne vector.
Il y a quelques typedef mais pas pour les iterator. Je pensais que
c'étaient des classes friend, mais en fait ce sont carrément des
classes internes (comme les inner-class en Java, je savais même pas de
c'était possible en C++).
Voila a quoi ressemble l'implémentation de VC++ pour vector:
Impeccable merci beaucoup, en effet rajouter typename devant
std::vector résoue le problème. Mais j'avoue que j'ai du mal a saisir
l'origine de typename. Quand on ouvre stl_vector.h, on trouve la ligne
suivante:
typedef __gnu_cxx::__normal_iterator iterator;
Il faudrait connaitre le fonctionnement de __normal_iterator. Et ca a l'air de se compliquer.
__normal_iterator est un adaptateur (adapter) qui permet a priori
d'avoir une certaine interface (c'est un design pattern). En standard
la stl fourni std::reverse_iterator qui esr un adaptateur permettant de
transformer un iterator en reverse_iterator
par exemple
typedef std::reverse_iterator reverse_iterator;
ce qui change c'est (entre autre) que l'operateur ++ de
reverse_iterator fera la meme chose que l'operateur -- d'iterator par
un changement d'interface.
vecchio56, on appel ca des types membres (ou type encapsulé) et c'est
tres important en c++ car c'est le seul moyen de programmer proprement,
il y en a plein la STL.
typedef T* iterator;
ca revient au meme de faire
class iterator {};
dans les deux cas iterator est un type membre de vector
si tu fais une classe qui charge une image bmp et que cette classe agrege un objet de type bmp_header, plutot que de faire
class bmp_header
{
};
class bmp
{
bmp_header _header;
};
il est bien plus raisonnable de faire (car header n'a de raison d'etre que dans bmp)