This is an old revision of the document!
Considérons un algorithme de recherche d'un plus grand élément :
template<class T> T find_greatest_element(T theArray[], size_t theNumberOfElements) { if (theNumberOfElements == 0) return T(); T greatestElement = theArray[0]; for (int index = 1; index < theNummberOfElements; index++) { if (theArray[index] > greatestElement) greatestElement = theArray[index]; } return greatestElement; }
Ce code ne fonctionne qu'avec des tableaux, cependant ce code pourrait fonctionner a priori pour tout ensemble de données quelqu'il soit. En effet il suffirait de le réécrire cette manière en pseudo-code :
find_greatest_element(aCollection) si aCollection est vide: aucun plus grand élément. greatestElement <= premier élément de aCollection. tant qu'il existe un élément suivant de aCollection: nextElement <= élément suivant de aCollection si nextElement > greatestElement: greatestElement = nextElement; retourne greatestElement.
On constate donc que le code peut-être généraliser pour fonctionner avec n'importe quelle collection si on peut “énumérer” les éléments dans la cette collection d'éléments.
L'idée consiste donc à fournir une abstraction permettant d'énumérer les éléments dans une structure de données quelque soit.
Pour pouvoir énumérer les éléments stockés dans une structure de données, il est nécessaire que cette structure de données fournissent une classe qui va permettre d'énumérer les données. Cette classe que l'on appeller iterateur va devoir fournir les opérateurs suivants :
operator ==(iterator) | test si deux iterateurs font référence au même élément stocké dans la structure de données. |
value_type operator *() | retourne une référence sur l'élément stocké dans la structure de données. |
operator +() | passe à l'élément situé après l'élément actuellement référence par l'itérateur. |
Il s'agit là des opérations minimales qu'un itérateur doit fournir. Il existe des énumérateurs plus riches qui ajoutent des opérations supportées comme notamment :
operator –() | passe à l'élément situé avant l'élément actuellement référence par l'itérateur. |
pour des itérateurs qui sont dits réversibles.