Je viens d'un milieu C.
Lorsque l'on itère dans un conteneur tel qu'un vecteur ou un deque qui contient des éléments dans une mémoire contiguë, il est facile de comprendre qu'en incrémentant l'itérateur pour pointer sur l'élément suivant dans le vecteur, comme dans la boucle ci-dessous, on peut juste augmenter l'adresse de l'itérateur par la taille de l'élément dans le vecteur, dans ce cas int.
vector<int> vec;
vector<int>::iterator it;
for (it = vec.begin; it != vec.end(); it++)
{
// do something on each element
}
L'avantage de l'utilisation des itérateurs est que nous pouvons découpler le code de l'algorithme du type de conteneur réel. Ainsi, si nous décidons plus tard d'utiliser une liste au lieu d'un vecteur, nous pouvons utiliser le même code d'itération que ci-dessus sur la liste.
Il est possible d'itérer dans une liste exactement de la même manière, mais une liste aura des éléments qui ne se trouvent pas dans des emplacements mémoire contigus, alors comment l'itérateur s'incrémente-t-il et trouve-t-il l'adresse correcte de l'élément suivant ?
D'après ce que j'ai compris de l'implémentation des listes liées en C, nous vérifions le pointeur dans le nœud, éventuellement appelé "next", qui pointe vers le nœud suivant de la liste.
Est-ce que c'est exactement ce qui se passe ici en C++ dans les coulisses lors de l'utilisation des itérateurs de liste ? Par conséquent, lorsqu'un itérateur pointe sur un élément de liste, afin de pointer sur l'élément suivant, le compilateur génère un code complètement différent de celui qui pointe sur l'élément suivant dans un vecteur ? Merci d'avance.