www.wikidata.de-de.nina.az
Der Begriff Iterator stammt aus dem Bereich der Softwareentwicklung und bezeichnet einen Zeiger mit dem die Elemente einer Menge durchlaufen werden konnen z B eine Liste Der Begriff leitet sich aus der mathematischen Methode der Iteration ab Der Iterator wird insbesondere im Bereich der Datenbanken meist Cursor genannt Inhaltsverzeichnis 1 Beschreibung 1 1 Externe Iteratoren und das Iterator Entwurfsmuster 1 2 Implizite Iteratoren 1 3 Der Gegensatz zum Indizieren 1 4 Generatoren 2 Iteratoren in verschiedenen Programmiersprachen 2 1 C und andere NET Sprachen 2 2 C 2 3 Java 2 4 MATLAB 2 5 PHP 2 6 Python 2 7 Ruby 2 8 Rust 3 Siehe auch 4 Weblinks 5 EinzelnachweiseBeschreibung BearbeitenEin Iterator ist ein spezieller Zeiger der innerhalb eines Programms vom Software Entwickler dazu verwendet werden kann um auf Elemente einer Menge vereinfacht eine Liste zuzugreifen Iteratoren arbeiten nach dem Grundprinzip Wenn es ein weiteres Element in der Liste gibt dann stelle es zur Verfugung Dies ist vereinfacht damit vergleichbar wie man einen Text der eine Liste von Worten ist liest Wenn es ein nachstes Wort gibt dann lies es Wenn kein weiteres Wort mehr folgt ist der Text beendet In jedem als Iteration bezeichneten Zugriffs Schritt steht somit exakt ein Wort des Textes zur Bearbeitung zur Verfugung Viele der in der Programmierpraxis verwendeten Iteratoren stellen uber die lesende Zugriffsmoglichkeit hinaus Mechanismen zur Verfugung die ein aktuell gelesenes Element aus der Liste entfernen oder ein neues Element in die Liste aufnehmen so wie bei der Bearbeitung eines Textes Worte eingefugt oder geloscht werden konnen Externe Iteratoren und das Iterator Entwurfsmuster Bearbeiten Hauptartikel Iterator Entwurfsmuster Ein externer Iterator kann als eine Art Zeiger betrachtet werden der zwei primare Funktionen besitzt Ein bestimmtes Element in einer Menge von Objekten referenzieren element access genannt sowie durch selbst Modifizierung auf das nachste Element in der Menge zu zeigen element traversal genannt Abhangig von der verwendeten Programmiersprache und der Anwendung konnen Iteratoren zusatzliche Funktionalitat sowie verschiedenes Verhalten aufweisen Der Hauptzweck des Iterators ist es dem Benutzer zu erlauben auf jedes Element in einer Menge zuzugreifen wahrend es ihn von der Datenstruktur der Menge isoliert Dies befahigt die Menge die Elemente auf jede mogliche Art und Weise zu verwalten wahrend sie sich dem Benutzer gegenuber so verhalt als ware sie eine simple Sequenz oder eine Liste Eine Iteratorklasse wird in enger Koordination mit ihrer Containerklasse also ihrer Menge entworfen Ublicherweise stellt die Containerklasse die Funktionen zur Verfugung die zur Erstellung von Iteratoren benutzt werden Ein Zahler in einer Schleife auch loop Counter genannt wird manchmal auch als Schleifeniterator bezeichnet Dabei ist zu beachten dass ein solcher Zahler nur die element traversal Funktionalitat abbildet und nicht die element access Funktionalitat Implizite Iteratoren Bearbeiten Mehrere Objektorientierte Sprachen wie Perl Python C Ruby sowie neuere Java und Delphi Versionen stellen eine intrinsische Art durch Elemente zu iterieren zur Verfugung ohne dabei ein explizites Iteratorobjekt zu benutzen Dieses kann allerdings auch vorhanden sein ist aber nicht im Code der jeweiligen Programmiersprache verfugbar wenn dies der Fall sein sollte Implizite Iteratoren manifestieren sich oft durch den foreach Befehl oder seine Aquivalente wie unten stehendes Python Beispiel zeigt for value in iterable print value Die Menge Liste iterable wird mittels der for Schleife durchlaufen in jedem Schleifendurchlauf enthalt die Variable value jeweils das aktuelle Element aus iterable Manchmal werden Iteratoren auch direkt vom Objekt der Datensammlung generiert wie unten stehendes Ruby Beispiel zeigt iterable each do value puts value end Der Aufruf der Methode each der Menge Liste iterable liefert einen Iterator den die do Schleife Element fur Element abschreitet Fur jedes Element wird der Schleifenkorper puts value ausgefuhrt wobei die Variable value das jeweils aktuelle Element enthalt Dieser Iterationsstil wird auch internal iteration genannt da sein Code vollstandig im Kontext des zu iterierenden Objektes ausgefuhrt wird Dieses kontrolliert somit samtliche Aspekte der Iteration der jeweilige Benutzer respektive Programmierer stellt nur die Operation fur die einzelnen Iterationsschritte zur Verfugung indem er eine anonyme Subroutine benutzt Sprachen welche sogenannte Listenkomprehensionen oder ahnliche Konstrukte unterstutzen bedienen sich analog zu Python ebenfalls der impliziten Iteratoren wahrend der Erstellung der Resultatsliste names person name for person in roster if person male for in ist hier die Schleife uber der Menge Liste roster mit aktuelles Element Variable person Fur jedes Element wird gepruft ob fur das Element eine Bedingung zutrifft if person male die Menge wird also gefiltert Von den verbleibenden Elementen wird jeweils person name in die Ergebnisliste names ubernommen eine Liste der Namen Manchmal ist die implizite versteckte Natur nur teilweise vorhanden Die Programmiersprache C stellt die for each Funktionalitat uber Funktionstemplates zur Verfugung diese erlaubt die implizite Iteration Der Gegensatz zum Indizieren Bearbeiten Der Iterator steht dabei im Gegensatz zu einem Index oder Schlussel Uber einen Iterator kann man direkt auf das zugehorige Element zugreifen ohne die Datenstruktur selber zu kennen Bei einem Index benotigt man immer Index und Datenstruktur Ein Iterator ist nur fur genau eine Datenstruktur gultig Ein Index kann auf andere Datenstrukturen ubertragen werden Iteratoren lassen sich nicht serialisieren Sie mussen dazu erst zu einem Index gewandelt werden Die Fahigkeit eines Containers zur Selbst Modifizierung wahrend durch seine Elemente iteriert wird hat sich in modernen objektorientierten Programmiersprachen als wichtig erwiesen Die Zwischenbeziehungen zwischen den einzelnen Objekten und der Effekte ihrer Operationen sind in solchen Sprachen nicht mehr eindeutig Um dieses Problem zu losen werden Iteratoren eingesetzt Generatoren Bearbeiten Ein Generator ist eine spezielle Form einer Koroutine die bei jedem Aufruf ein oder mehrere Element e einer Folge liefert Diese Folge kann eine gegebene Liste sein dann entspricht der Generator weitgehend einem Iterator Ein Generator kann die nachsten Elemente aber auch erst beim jeweiligen Aufruf erzeugen dann benotigt er keine bestehende Liste wie sie beim Iterator notwendig ist Die meisten Iteratoren lassen sich in naturlicher intuitiver Art und Weise durch Generatoren implementieren Da Generatoren ihren lokalen Status zwischen Funktionsaufrufen beibehalten eignen sie sich hervorragend zur Implementierung von komplexen zustandsorientierten Iteratoren wie beispielsweise Binarbaumtraversierer Beispiel eines Generators der Elemente erzeugt anstatt sie aus einer Liste zu lesen Fibonacci Folge Ruckgabe des jeweiligen Werts mit Hilfe des Python Befehls yield Ein Generator fur die Fibonacci Folge def fibonacci limit anzahl elemente a b 0 1 for in range limit anzahl elemente a b b a b yield a Die ersten Zahlen der Folge werden berechnet und ausgegeben for number in fibonacci 100 print number Iteratoren in verschiedenen Programmiersprachen BearbeitenC und andere NET Sprachen Bearbeiten Iteratoren im NET Framework werden als Enumeratoren bezeichnet und von der Schnittstelle IEnumerator reprasentiert IEnumerator stellt eine Funktion namens MoveNext zur Verfugung die jeweils zum nachsten Element der Menge geht und anzeigt wenn das Ende erreicht ist sowie eine Eigenschaft namens Current um den Wert des aktuellen Elementes zu erhalten Des Weiteren wird eine optionale Reset Funktion angeboten um an den Anfang zuruckzukehren Der Enumerator gibt als Initialisierungswert einen speziellen Wert zuruck der den Anfang markiert Aus diesem Grund ist es notig nach der Initialisierung MoveNext auszufuhren Enumeratoren werden typischerweise von einer GetEnumerator Funktion zuruckgegeben welche einem Objekt zugehorig ist das die IEnumerable Schnittstelle implementiert Der foreach Befehl in C operiert allerdings auf jeder solchen Funktion selbst wenn diese nicht von einem Objekt stammt welches die IEnumerable Schnittstelle implementiert Das folgende Beispiel zeigt eine simple Verwendung von Iteratoren in C 2 0 explizite Version IEnumerator lt MyType gt iter list GetEnumerator while iter MoveNext Console WriteLine iter Current implizite Version foreach MyType item in list Console WriteLine item C 2 0 unterstutzt ebenfalls Generatoren Eine Funktion welche als IEnumerable oder auch IEnumerator zuruckkehrt aber den Befehl yield return dabei benutzt wird vom Compiler automatisch in eine neue Klasse umgewandelt welche die angemessene Schnittstelle implementiert C Bearbeiten Die Programmiersprache C setzt Iteratoren im grossen Stil ein und stellt uber die C Standardbibliothek Iteratoren verschiedener Typen wie sogenannte forward iterators bidirectional iterators und random access iterators zur Verfugung Jede der Standard Containerklassen besitzt Iteratortypen Die Syntax der Standarditeratoren wurde an der Zeigerarithmetik von C angelehnt Die Operatoren und gt werden zur Referenzierung der Elemente benutzt Weitere Operatoren wie werden benutzt um durch die Elemente zu navigieren Iteratoren werden ublicherweise paarweise eingesetzt Der eine Iterator stellt die aktuelle Iteration dar wahrend der andere das Ende der Iteration darstellt Die Iteratoren werden von der entsprechenden Containerklasse durch die Benutzung der Standardfunktionen begin und end generiert Der Iterator der durch begin zuruckgegeben wird zeigt auf das erste Element wahrend der Iterator der von end zuruckgeliefert wird auf einen speziellen Wert zeigt welcher kein Element referenziert Wenn ein Iterator hinter das letzte Element gesetzt wird gibt dieser den speziellen Wert von end zuruck Das folgende Beispiel zeigt die typische Definition und Verwendung eines Iterators in C 11 1 include lt iostream gt include lt stdexcept gt include lt initializer list gt class Vector public using iterator double iterator begin return elem iterator end return elem sz Vector std initializer list lt double gt lst elem nullptr sz 0 sz lst size elem new double sz double p elem for auto i lst begin i lst end i p p i Vector delete elem int size const return sz double amp operator int n if n lt 0 n gt sz throw std out of range Vector operator return elem n Vector const Vector amp delete Dreierregel Vector amp operator const Vector amp delete private double elem int sz int main Vector v 1 1 1 1 2 2 2 2 for const auto amp x v std cout lt lt x lt lt n for auto i v begin i v end i std cout lt lt i lt lt n for auto i 0 i lt v size i std cout lt lt v i lt lt n Die Programmausgabe ist 1 21 4 84 1 21 4 84 1 21 4 84 terminate called after throwing an instance of std out of range what Vector operator Es existieren viele verschiedene Iteratortypen mit leicht voneinander abweichendem Verhalten Nicht jeder Iteratortyp unterstutzt jeden Containertyp Es ist allerdings fur Programmierer moglich eigene Iteratortypen zu definieren indem sie eine Klasse vom Template std iterator ableiten Die Iteratorsicherheit ist fur die verschiedenen Typen separat definiert Die implizite Iteration ist in C teilweise vorhanden und wird von den Funktionen std for each 2 std copy 3 und std accumulate 4 zur Verfugung gestellt Iteratoren benotigen allerdings immer ein explizites Objekt zu ihrer Initialisierung ublicherweise diejenigen welche von begin und end zuruckgegeben werden Sobald diese ausgefuhrt wurde geschieht die Iteration auf implizite Weise ohne das Iteratorobjekt weiter zu benutzen Das unten stehende Beispiel zeigt die Verwendung von for each Ein beliebiger Standard Containertyp jedes ItemType Elements ContainerType lt ItemType gt c Funktion die Zugriff auf jedes Element besitzt void processItem const ItemType amp i std cout lt lt i lt lt n Eine for each Iterationsschleife std for each c begin c end processItem Dasselbe kann durch den Einsatz von std copy und std ostream iterator 5 erreicht werden std copy C begin C end std ostream iterator lt ItemType gt std cout n Eine Einschrankung dieser Technik ist dass es dem Rumpf nicht erlaubt inline deklariert zu sein Zudem benotigt dies einen Funktionszeiger welcher an anderer Stelle deklariert werden und als Parameter ubergeben werden muss Dies kann teilweise durch die Benutzung von Bibliotheken wie Boost und der Anwendung von Lambda kompensiert werden die gebraucht werden um Funktionsobjekte mit verwandter Infix Syntax zu generieren Da diese Funktionalitat nur uber externe Bibliotheken zur Verfugung gestellt wird mussen diverse Problemumgehungen auch Workarounds genannt eingesetzt werden Java Bearbeiten Die Schnittstelle java util Iterator 6 die im Java JDK 1 2 eingefuhrt wurde erlaubt das Iterieren von Containerklassen Jeder Iterator stellt Funktionen namens next 7 hasNext 8 sowie eine optionale Funktion namens remove 9 zur Verfugung Iteratoren werden ublicherweise von einer Funktion namens iterator generiert welche von der dementsprechenden Containerklasse zur Verfugung gestellt wird Ein Iterator gibt als Initialisierungwert einen speziellen Wert zuruck der den Anfang markiert Aus diesem Grund ist es notig nach der Initialisierung next auszufuhren womit das erste Element zuruckgegeben wird Die Funktion hasNext wird dazu benutzt um herauszufinden ob das letzte Element bereits zuruckgegeben wurde Das folgende Beispiel zeigt eine simple Verwendung von Iteratoren in Java Iterator iter list iterator while iter hasNext System out println iter next Fur Kollektionen die es unterstutzen entfernt die optionale Funktion remove das letzte Element auf das zugegriffen wurde Die meisten anderen Modifikationen dieser Art sind unsicher Zusatzlich besitzt java util List 10 einen Iterator namens ListIterator 11 welcher eine ahnliche Schnittstelle zur Verfugung stellt die Vorwarts und Ruckwartsiteration erlaubt sowie den Index des aktuellen Elementes zuruckgibt und das Element an einer gegebenen Position einfugen kann Mit der J2SE 5 0 wurde die Schnittstelle Iterable 12 eingefuhrt welche eine erweiterte for Schleife im Sinne von foreach darstellt Iterable definiert die Funktion iterator 13 welche einen Iterator zuruckliefert Mit der Benutzung der erweiterten for Schleife kann das vorhergehende Beispiel auf folgende Art und Weise geschrieben werden for MyType obj list System out print obj MATLAB Bearbeiten MATLAB unterstutzt externe sowie interne Iteratoren Im Falle einer externen Iteration bei welcher der Benutzer dazu verpflichtet ist das nachste Element bereitzustellen konnen mehrere Elemente definiert werden und mit einer for Schleife anschliessend durchgelaufen werden wie folgendes Beispiel zeigt Definition eines an integer arrays myArray 1 3 5 7 11 13 for n myArray etwas mit n machen disp n Integerausgabe zur Kommandozeile end Im Falle einer internen Iteration kann der Benutzer eine Operation dem Iterator ubergeben um auf jedes Element in einem Array zuzugreifen Viele nativen Operatoren und MATLAB Funktionen werden uberladen um ein korrespondierendes Ausgabearray als impliziten Ruckgabewert zu erhalten Des Weiteren konnen die Funktionen arrayfun und cellfun fur Benutzerdefinierte Operationen uber native und sogenannte cell Arrays gebraucht werden function simpleFun Definition eines an integer arrays myArray 1 3 5 7 11 13 Benutzerdefinierte Operation fur jedes Element durchfuhren myNewArray arrayfun a myCustomFun a myArray Arrayausgabe zur Kommandozeile myNewArray function outScalar myCustomFun inScalar Mit 2 multiplizieren outScalar 2 inScalar Alternativerweise kann es wunschenswert sein die Speichermechanismen des Arrays vom Programmieren zu abstrahieren indem eine benutzerdefinierte objektorientierte Implementierung des Iteratorentwurfsmusters zur Verfugung gestellt wird Eine solche Implementierung welche die externe Iteration unterstutzt wird im MATLAB Central File Exchange item 14 angeboten Dieses Entwurfsmuster ist nach der neuen Klassendefinitionssyntax geschrieben welche mit der MATLAB Version 7 6 R2008a eingefuhrt wurde Des Weiteren ist eine eindimensionale cell Array Realisierung des List Abstract Data Type enthalten um eine heterogene Speicherung jedes Datentyps vorzunehmen Es stellt die Funktionalitat zur Verfugung um eine Liste mit hasNext next und reset in einer while Schleife zu verarbeiten PHP Bearbeiten Mit PHP4 wurde ein foreach Konstrukt eingefuhrt das ahnlich wie in Perl und vielen anderen Programmiersprachen aufgebaut war Dieses Konstrukt erlaubt eine einfache Art uber Arrays zu iterieren Der foreach Befehl funktioniert nur mit Arrays in PHP4 und wird einen Fehler melden wenn versucht wird ihn uber einen anderen Datentyp oder einer uninitialisierten Variable zu benutzen In PHP5 ist der foreach Befehl zur Iteration uber alle public members erlaubt Das folgende Beispiel zeigt zwei unterschiedliche Schreibweisen die zweite ist eine nutzliche Erweiterung zur ersten Schreibweise Beispiel Aforeach array expression as value echo value n Beispiel Bforeach array expression as key gt value echo key value n Im Beispiel A wird uber ein Array welches von array expression dargestellt wird iteriert Bei jedem Schleifendurchlauf wird der Wert des Arrayelementes an value zugewiesen sowie der interne Zeiger des Arrays um eins nach vorne geschoben Somit wird beim nachsten Schleifendurchlauf das nachste Arrayelement zuruckgegeben Das Beispiel B besitzt dieselbe Funktionalitat wie das Beispiel A Zusatzlich wird der Index des Elementes bei jedem Schleifendurchlauf der Variable key zugewiesen In PHP5 ist die Iteratorschnittstelle vordefiniert Objekte konnen verandert werden um die Iteration zu handhaben class MyIterator implements Iterator private var array public function construct array if is array array this gt var array public function rewind echo rewinding n reset this gt var public function current var current this gt var echo current var n return var public function key var key this gt var echo key var n return var public function next var next this gt var echo next var n return var public function valid var this gt current false echo valid var n return var Diese Funktionen werden alle in einer kompletten foreach obj as key gt value sequenz genutzt Die Iteratormethoden werden in der folgenden Reihenfolge ausgefuhrt 1 rewind 2 while valid 2 1 current in value 2 3 key in key 2 4 next Python Bearbeiten Iteratoren in Python stellen einen fundamentalen Teil der Sprache dar allerdings werden sie vielfach implizit und somit unsichtbar in Sprachbefehlen versteckt genutzt Solche Befehle sind z B for foreach in sogenannten list comprehensions und in Generatorausdrucken Alle sequentiellen Basistypen sowie viele Klassen der Standardbibliothek in Python unterstutzen Iterationen Das folgende Beispiel zeigt eine typische Iteration uber einer Sequenz for value in sequence print value Python Dictionaries eine Form von Assoziativem Array erlaubt es direkt uber sich zu iterieren wenn die sogenannten dictionary keys zuruckgegeben werden Es kann aber auch uber die items Funktion eines dictionary iteriert werden wo es die Werte dem nachfolgenden Beispiel entsprechend zu key und value zuruckgibt for key in dictionary value dictionary key print key value for key value in dictionary items print key value Iteratoren in Python konnen aber auch explizit definiert und benutzt werden Fur jeden iterierbaren Sequenztypen oder jede iterierbare Klasse steht die eingebaute iter Funktion zur Verfugung um ein Iteratorobjekt zu generieren Mit dem Iteratorobjekt kann mit den Funktionen next oder next zum nachsten Element navigiert werden Ist das Ende der Menge erreicht wird ein StopIteration Fehler aufgeworfen Das nachfolgende Beispiel zeigt eine Aquivalente Implementation von expliziten Iteratoren it iter sequence while True try value it next except StopIteration break print value Jede benutzerdefinierte Klasse kann die Standarditeration unterstutzen wenn eine iter Funktion definiert wurde welche ein Iteratorobjekt generiert der Iterator muss dann eine next Funktion definieren die das nachste Element zuruckgibt Die Python Generatoren implementieren dieses Iterationsprotokoll Ruby Bearbeiten Die Implementation der Iteratoren in Ruby unterscheidet sich von den meisten anderen Programmiersprachen Alle Iterationen gehen dem Gedanken nach sogenannte callback closures an Containermethoden durchzureichen Auf diese Art und Weise implementiert Ruby nicht nur eine Basisfunktionalitat an Iteratoren sondern bildet viele Iteratorentwurfsmuster ab wie z B sogenanntes function mapping Filter und sogenanntes reducing Ruby unterstutzt des Weiteren noch eine alternative Syntax fur jede Basisfunktion zur Iteration 0 42 each do n puts n end und for n in 0 42 puts n end oder noch kurzer 42 times do n puts n end Rust Bearbeiten In Rust werden Iteratoren ebenfalls haufig implizit genutzt jedoch ist auch das funktionale Programmieren mit expliziten Iteratoren moglich Iteratoren werden in Rust bedarfsweise ausgewertet d h alle Funktionen auf Iteratoren werden erst dann auf die eigentlichen Elemente angewendet wenn sie ausgelesen werden Die for Schleife ist ein Beispiel fur die implizite Nutzung eines Iterators let numbers vec 24 30 13 19 12 17 for number in numbers println Zahl number Mithilfe von expliziten Iteratoren und anonymen Funktionen ist Rust mit einem funktionalen Paradigma nutzbar Das folgende Beispiel zeigt wie eine Funktion aussehen konnte die die Summe der Quadrate aller ungeraden Zahlen von 1 bis zu einer bestimmten Zahl n berechnet fn sum of odd squares up to n u32 gt u32 1 n Eine Range ist in Rust ein Iterator filter n 2 1 Alle geraden Zahlen werden verworfen map n n pow 2 Ersetze jede Zahl durch ihr Quadrat sum Berechne die Summe Siehe auch BearbeitenIterator EntwurfsmusterWeblinks BearbeitenJoshua Gatcomb Understanding and Using Iterators englisch A Technique for Generic Iteration and Its Optimization PDF englisch 216 kB STL Iterators englisch What are iterators Referenzbeschreibung englisch Interface Iterator Java API NET Interface im MSDN Boost C Iterator Library englisch PHP Object Iteration englisch Einzelnachweise Bearbeiten Bjarne Stroustrup Programming Principles and Practice using C 2 Auflage Addison Wesley 2014 ISBN 978 0 321 99278 9 S 729 ff std for each std copy std accumulate std ostream iterator java util Iterator Java API Specification next Java API Specification hasNext Java API Specification remove Java API Specification java util List Java API Specification java util ListIterator Java API Specification Iterable Java API Specification iterator Java API Specification Entwurfsmuster Iterator Verhalten Abgerufen von https de wikipedia org w index php title Iterator amp oldid 237539188