Iterator
Dans le de l'informatique, un iterator est un objet qui permet à un programmeur de traverser par tous les éléments d'une collection, indépendamment de son exécution spécifique. Un iterator s'appelle parfois un curseur , particulièrement dans le contexte d'une base de données .
Description
Un iterator peut être considéré comme un type d'indicateur qui a deux opérations primaires : mettant en référence un élément particulier dans la collection d'objet (appelée l'accès d'élément de ), et se modifiant ainsi il indique le prochain élément (appelé le traversal d'élément de ). Il doit également y a une manière de créer un iterator ainsi qu'il indique un certain premier élément aussi bien qu'une certaine manière de déterminer quand l'iterator a épuisé tous les éléments dans le récipient. Selon la langue et l'utilisation prévue, les iterators peuvent également fournir des opérations additionnelles ou exhiber différents comportements.
Le but primaire d'un iterator est de permettre à un utilisateur de traiter chaque élément d'un récipient tout en isolant l'utilisateur de la structure interne du récipient. Ceci permet au récipient de stocker des éléments de n'importe quelle façon qu'il souhaite tout en permettant l'utilisateur la traiter comme si c'étaient un ordre ou une liste simple. Une classe d'iterator est habituellement conçue dans la coordination serrée avec la classe correspondante de récipient. Habituellement le récipient fournit les méthodes pour créer des iterators.
Noter qu'un compteur de boucle désigné parfois également sous le nom d'un iterator de boucle. Un compteur de boucle , cependant, fournit seulement la fonctionnalité de traversal et pas la fonctionnalité d'accès d'élément.
Différer de l'indexation
Dans des langages procéduraux il est commun à l'indexation d'utilisation basée sur un compteur de boucle pour faire une boucle par tous les éléments dans un ordre tel qu'une rangée. Bien que l'indexation puisse également être employée avec quelques récipients orientés objectivement, l'utilisation des iterators peut avoir quelques avantages :
Les boucles de compte de
ne sont pas appropriées à toutes les structures de données, en particulier aux structures de données sans ou au lent à accès sélectif, comme les listes ou les arbres .
Iterators peut fournir une manière cohérente de réitérer sur des structures de données de toutes les sortes, et rend donc le code plus lisible, réutilisable, et moins sensible à un changement de la structure de données.
un iterator peut imposer des restrictions additionnelles à l'accès, tel que s'assurer que des éléments ne peuvent pas être sautés ou qu'un élément précédemment visité ne peut pas être accédé une deuxième fois.
un iterator peut permettre à l'objet de récipient d'être modifié sans infirmer l'iterator. Par exemple, une fois qu'un iterator a avancé au delà du premier élément il peut être possible d'insérer les éléments complémentaires dans le commencement du récipient avec des résultats prévisibles. Avec l'indexation c'est problématique puisque les indices doivent changer.
La capacité d'un récipient d'être modifié tandis que l'itération par ses éléments est devenue nécessaire dans le moderne orienté objectivement programmant, où les corrélations entre les objets et les effets des opérations peuvent ne pas être évidentes. En employant un iterator un est isolé dans ces sortes de conséquences.
Iterators implicites
Certains langages de type objet tels que Perl , python , C# , rubis et versions postérieures de Java et de Delphes fournissent une manière intrinsèque de l'itération par les éléments d'un objet de récipient sans introduction d'un objet explicite d'iterator. Ceci est souvent manifesté par une certaine sorte de " ; Foreach " rapport, comme dans les exemples suivants :
lang=" de avec la variable implicite foreach (@list) { " d'impression ; $_ \ n" ; ; } la variante la plus courte de using le modificateur de rapport " d'impression ; $_ \ n" ; @list de foreach ;
lang=" de
lang=" de
lang=" de
lang=" de
lang=" de
lang=delphi> de La langue du C++ a également un voient également : du générateur (de l'informatique) L'one-way de mettre en application des iterators emploie un genre spécial de sous-routine , connu sous le nom de générateur, qui peut des valeurs du rendement de à ses temps multiples de visiteur (au lieu du renvoi juste une fois). La plupart des iterators sont naturellement exprimables comme générateurs, mais parce que les générateurs préservent leur état local entre les invocations, ils sont particulièrement bien adaptés pour des iterators compliqués et stateful, tels que des chariots d'arbre. Un exemple d'un générateur renvoyant les nombres de Fibonacci using le rapport de s lang=" de La langue du C++ fait l'utilisation large des iterators dans sa bibliothèque standard de calibre de , qui fournit plusieurs différents genres d'iterators, y compris les iterators vers l'avant de , les iterators bi-directionnels de , et les iterators à accès sélectif de . Tous les types standard de calibre de récipient fournissent un ensemble riche et cohérent de types d'iterator. La syntaxe des iterators standard est conçue pour ressembler à cela de l'indicateur ordinaire arithmétique de du C , où le Iterators sont habituellement employés dans les paires, où une est employée pour l'itération réelle et la seconde sert à marquer l'extrémité de la collection. Les iterators sont créés par la classe correspondante de récipient suivre des méthodes standard telles que le Quand un iterator est avancé au delà du dernier élément il est par définition égal au spécial finissent la valeur d'iterator. L'exemple suivant montre une utilisation typique d'un iterator. lang=" de Il y a beaucoup de variétés d'iterators chacune avec le comportement légèrement différent, incluant : iterators vers l'avant, renversés, et bi-directionnels ; iterators à accès sélectif ; iterators d'entrée et de rendement ; et iterators de const (qui protègent le récipient ou ses éléments contre la modification). De quelque manière que non chaque type de récipient soutient chaque type d'iterator. Il est possible que les utilisateurs créent leurs propres types d'iterator en dérivant des sous-classes du La sûreté d'Iterator est définie séparément pour les différents types de récipients standard, dans certains cas l'iterator est très laxiste en permettant au récipient de changer tout en réitérant. Présenté dans le dégagement de JDK 1.2 de Java , l'interface permet l'itération des classes de récipient. Chaque La méthode du lang=" de Pour les types de collection qui le soutiennent, la méthode du En plus, parce que il y a d'a avec un api semblable mais cela permet l'itération vers l'avant et en arrière, fournit son index courant dans la liste et permet l'arrangement de l'élément de liste à sa position. Le dégagement du J2SE 5.0 de Java a présenté l'interface pour soutenir une boucle augmentée de lang=" de Iterators dans le cadre du .NET s'appellent le " ; enumerators" ; et représenté par l'interface d'IEnumerator. IEnumerator fournit une méthode de MoveNext (), qui avance au prochain élément et indique si l'extrémité de la collection a été atteinte ; une propriété courante, pour obtenir la valeur de l'élément étant actuellement aigu à ; et une méthode facultative de remise (), pour rebobiner l'agent recenseur de nouveau à sa position initiale. L'agent recenseur indique au commencement une valeur spéciale avant le premier élément, ainsi un appel à MoveNext () est exigé pour commencer à réitérer. Des agents recenseurs sont typiquement obtenus en appelant la méthode de GetEnumerator () d'objet mettant en application l'interface d'IEnumerable. Les classes de récipient mettent en application typiquement cette interface. Cependant, le rapport de Foreach dans le C# peut opérer n'importe quel objet fournissant une telle méthode, même si il ne met pas en application IEnumerable. Les deux interfaces ont été augmentées dans des versions génériques du dans le . Les expositions suivantes une utilisation simple des iterators dans C# 2.0 : lang=" de version implicite de // foreach (valeur de MyType dans la liste) Console.WriteLine (valeur) ; C# 2.0 soutient également les générateurs : une méthode qui est déclarée en tant que renvoi d'IEnumerator (ou d'IEnumerable), mais emploie le " ; return" de rendement ; le rapport pour produire un ordre des éléments au lieu de renvoyer un exemple d'objet, sera transformé par le compilateur en nouvelle classe mettant en application l'interface appropriée. Iterators dans le python sont une partie fondamentale de la langue et vont dans beaucoup de cas invisible car ils sont implicitement employés dans le rapport de lang=" de Les dictionnaires de python (une forme de rangée associative ) peuvent également être directement réitérés plus de, quand les clefs de dictionnaire sont retournées ; ou la méthode des articles dictionnaire peut être réitérée au-dessus d'où elle rapporte la clef correspondante, valeur appareille comme tuple : lang=" de lang=" de Iterators cependant peut être employé et défini explicitement. Pour n'importe quel type ou classe iteratable d'ordre, le lang=" de N'importe quelle classe définie pour l'utilisateur peut soutenir l'itération standard (implicite ou explicite) en définissant une méthode du Instrument des générateurs du du python ce protocole d'itération. Dans PHP 5, on permet le foreach sur l'objet réitérant par tous les membres publics. Il y a deux syntaxes ; la seconde est une prolongation mineure mais utile de la première. Exemple A lang=" de L'exemple A fait une boucle au-dessus de la rangée donnée par array_expression. Sur chaque boucle, la valeur de l'élément courant est assignée à $value et l'indicateur interne de rangée est avancé par on (ainsi sur la prochaine boucle, vous regarderez le prochain élément). L'exemple B a la même fonctionnalité comme ci-dessus. En plus, la clef d'élément courant (dans ce cas-ci, array_expression) sera assignée au $key variable sur chaque boucle. L'interface d'Iterator est prédéfinie dans PHP 5 et des objets peuvent être adaptés aux besoins du client à l'itération de poignée. lang=" de Les iterators de XL généralisent des générateurs et des iterators. lang=" de iterator IntegerIterator (de variété compteur dehors : nombre entier ; Bas, haut : nombre entier) écrit contre dans le bas. La haute est Compteur : = bas tandis que boucle élevée de contre- <= rendement Compteur += 1 Note de // qui les besoins d'I ne pas être déclaré, parce que « variété avouée dehors » dans l'iterator // une déclaration implicite d'I comme nombre entier est donc fait ici pour I dans la boucle 1.WriteLn ; I=" ; , I .
std : : le calibre de fonction du for_each () qui tient compte de l'itération implicite semblable, mais elle exige toujours les objets explicites d'iterator en tant qu'entrée initiale. Elle également ne permet pas au corps d'être déclaré en ligne, exigeant une fonction ou un objet de fonction à déclarer ailleurs et être passée comme argument. Ceci peut être partiellement compensé en employant une bibliothèque telle que la poussée et en employant le lambda pour produire implicitement des objets de fonction avec la syntaxe familière d'opérateur d'infixe. Due à elle étant seulement une bibliothèque, cependant, certaines opérations doivent être faites par l'intermédiaire des contournements. Générateurs
yield de python 'peut être vu ci-dessous. Iterators dans différents langages de programmation
C++
* et le -> ; des opérateurs de sont habitués pour mettre en référence l'élément lequel l'iterator indique, et les opérateurs arithmétiques d'indicateur comme ++ sont employés pour avancer l'iterator au prochain élément. begin () et le end () . L'iterator retourné par le begin () indique le premier élément, alors que l'iterator retourné par le end () est une valeur spéciale qui ne met en référence aucun élément. std standard : : calibre de classe d'iterator. Java
Iterator fournit a et méthode, et peut sur option soutenir une méthode. Iterators sont créés par la classe correspondante de récipient, typiquement par une méthode appelée le iterator () . next () avance l'iterator et renvoie la valeur indiquée par l'iterator. Une fois d'abord créé, un iterator indique une valeur spéciale avant le premier élément, de sorte que le premier élément soit obtenu sur le premier appel au next () . Pour déterminer quand tous les éléments dans le récipient ont été visités le hasNext () la méthode d'essai de est employée. L'exemple suivant montre une utilisation simple des iterators : remove () d'iterator enlève l'élément récemment visité du récipient. La plupart des autres types de modification dans le récipient tout en réitérant être peu sûr. for ( Foreach ) pour réitérer au-dessus des collections et des rangées. Iterable définit la méthode qui renvoie un Iterator. Using la boucle augmentée de for, l'exemple précédent peut être récrit As C# et d'autres langues de .NET
Python< ! -- Cette section est liée de la rangée associative -->
for ( Foreach ), dans les compréhensions de liste de et dans les expressions de générateur de . Tous les types intégrés standard de l'ordre du python soutiennent l'itération, aussi bien que beaucoup de classes qui font partie de la bibliothèque standard. L'exemple suivant montre l'itération implicite typique au-dessus d'un ordre : iter de fonction de builtin () est employé pour créer un objet d'iterator. L'objet d'iterator fournit alors une méthode du next () qui renvoie le prochain élément dans le récipient. Il soulèvera une erreur de StopIteration quand plus d'éléments ne sont laissés. L'exemple suivant montre une itération équivalente au-dessus d'un ordre using des iterators explicites : __iter () qui crée un objet d'iterator. L'objet d'iterator doit alors définir une méthode du next () qui renvoie le prochain élément. PHP
PHP 4 de a présenté une construction de foreach, tout comme Perl et quelques autres langues de . Ceci donne simplement une manière simple de réitérer au-dessus des rangées. le foreach travaille seulement sur des rangées dans PHP 4, et publiera une erreur quand vous essayez de l'employer sur une variable avec un type de données différent ou une variable uninitialized. XL
Voir également
itération
Modèle d'Iterator de
Modèle de visiteur de
Modèle de conception de Random links: Parc national de plateau de Hann | Banlieue noire de Lynd, Minnesota | Alfred A. Foucher | Toute l'attaque de monstres | Sicherheitspolizei | Iterator