Comment sont les itérateurs et les pointeurs sont-ils liés?
Code avec les itérateurs ressemble pas mal de code avec des pointeurs. Les itérateurs sont de quelque obscure type (comme std::vector<int>::iterator
par exemple).
Ce que je ne comprends pas c'est comment les itérateurs et pointeur sont liés les uns aux autres - est un itérateur un wrapper autour d'un pointeur avec surchargé opérations à l'avance pour les éléments adjacents ou est-ce autre chose?
Vous devez vous connecter pour publier un commentaire.
Les itérateurs sont une généralisation des pointeurs.
Un itérateur (selon les variantes) ont à mettre en œuvre * et ++
Si un pointeur EST un itérateur. Mais pas forcément l'inverse.
Si vous souhaitez effectuer une itération sur une structure complexe (un arbre, un graphique...), l'itérateur sera beaucoup plus qu'un pointeur, et ne fait aucune référence à une réelle place dans la ram.
Les itérateurs sont des objets que la surcharge de certains opérateurs, ainsi que l'utilisation serait comme s'ils étaient des pointeurs. C'est dans les capacités d'un itérateur de la catégorie. Les itérateurs à accès aléatoire look tout à fait comme les pointeurs, d'autres types d'itérateurs ne fournissent pas certaines opérations (e.g
list<X>::iterator
qui est bidirectionnel n'a pas d'opérateur+=
parmi beaucoup d'autres qui auraient besoin d'un accès aléatoire).À la "obscur" de noms, il n'est pas totalement impensable d'utiliser un simple pointeur pour un itérateur:
Sur le plan conceptuel, oui-mais ils n'ont pas besoin d'être des pointeurs. Leurs internes et les capacités dépendent de la structure des données qu'ils "wrap".
C'est pourquoi il existe différents des "classes" de itérateurs. E. g. Unidirectionnel, Bidirectionnel, RandomAccess, etc.
Certains sont capables de plusieurs classes.
E. g. si la structure interne est un Rouge-Noir arbre ou une Liste chaînée, les itérateurs peut être Bidirectionnelle, mais pas RandomAccess. Si elles entourent un vecteur (implémentée par un tableau), vous aurez RandomAccess et Bidirectionnel.
Un itérateur est juste un type qui fournit l'interface pour les itérateurs - ci sont différents pour les différents types d'itérateurs et qui sont spécifiés à l'article 24.1 de la norme C++ (Itérateur Exigences).
Comment les itérateurs sont mis en œuvre dépend de ce qu'ils itérer sur - pour les vecteurs ils sont couramment d'un wrapper autour d'un seul pointeur vers un tableau (dans les versions release de toute façon), pour les plus complexes des conteneurs ils ont une plus compliqué de mise en œuvre. Pour ouvrir clos des plages ils contiennent de l'état quel que soit l'algorithme beimng utilisé pour générer les éléments.
Noter qu'un pointeur vers un élément dans un tableau répond aux exigences d'un itérateur à accès aléatoire, donc, dans une certaine mesure, ils sont interchangeables.