150 likes | 298 Views
ITERATOREN. und deren Verwendung in der STL. Programmierpraktikum im Grundstudium: „Generische Programmierung in C++“. © Rouven Maier. Iteratoren und deren Verwendung in der STL - Begriff des Iterators. Seite 1. Begriff des Iterators.
E N D
ITERATOREN und deren Verwendung in der STL Programmierpraktikum im Grundstudium: „Generische Programmierung in C++“ © Rouven Maier
Iteratoren und deren Verwendung in der STL - Begriff des Iterators Seite 1 • Begriff des Iterators Iteratoren sind Verweise auf Objekte in einer Sequenz (Container), mit denen man über die einzelnen Elemente der Sequenz “wandern” kann. Dieses “wandern” geschieht durch iterieren über den Elementen, d.h. der Iterator “wandert” von einem Element des Containers zum nächsten usw. Ein Iterator repräsentiert somit die Position eines Objekts in einer Sequenz aus Objekten. Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Objekt Objekt Objekt Objekt Objekt Objekt Iteratoren und deren Verwendung in der STL - Schaubild eines Iterators Seite 2 Schaubild eines Iterators: Iterator Container Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Iteratoren und deren Verwendung in der STL - Aufbau von Iteratoren Seite 3 • Aufbau von Iteratoren Das fundamentale Konzept für Iteratoren legt drei Grundoperationen für die Definition von Iteratoren fest: 1. Iterator::operator *() (Dereferenzierung): gibt das markierte Objekt als Ergebnis zurück 2. Iterator::operator++() (Inkrementierung) : setzt den Iterator um eine Position weiter 3. Iterator::operator==() (Gleichheit) : liefert als Ergebnis, ob zwei Iteratoren auf dasselbe Objekt einer Sequenz verweisen, oder nicht. Ausnahme: Output-Iteratoren Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Iteratoren und deren Verwendung in der STL - Elementfunktionen Seite 4 Damit man mit den Containern der STL auch unabhängig vom Datentyp arbeiten kann, stellen alle Container entsprechende Elementfunktionen bereit. Im Zusammenhang mit Iteratoren sind die beiden wichtigsten begin() und end(). - container::begin() liefert einen Iterator, der die Position des ersten Elements des Containers repräsentiert - container::end() liefert einen Iterator, der die Position hinter dem letzten Element des Containers repräsentiert Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Objekt Objekt Objekt Objekt Objekt Letztes Element Erstes Element Iteratoren und deren Verwendung in der STL - Schaubild 2 Seite 5 Schaubild zweier Iteratoren, die mit Hilfe der Elementfunktionen begin () und end () erzeugt wurden: container::begin() container::end () Container Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Iteratoren und deren Verwendung in der STL - Codebeispiel Seite 6 Aufgabe: An welcher Stelle einer Liste befindet sich der Integerwert 7 ? Wenn der Wert vorhanden ist, soll er mit dem Integerwert 8 ersetzt werden. #include <list> // list bietet die Standarditeratoren bereits an using namespace std; // list ist im namespace std definiert // Initialisieren einer Liste list<int> liste1; ... // z.B. Füllen der Liste list<int>::iterator iter=liste1.begin(); // Iterator am Anfang der Liste wird // erzeugt for (int i=0, iter != liste1.end(), ++iter, ++i) { // Benutzung des Iterator Operators != // (analog zu ==) // Referenzoperator * von iter benutzt if(*iter == 7) { // Wo ist die 7 ? cout << " 7 an Position " << (i+1); *iter = 8; } } // 7 == 8 setzen Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
CONTAINER ALGORITHMEN ITERATOREN Iteratoren und deren Verwendung in der STL - Sinn und Zweck Seite 7 Sinn und Zweck von Iteratoren Iteratoren dienen somit also als Schnittstelle zwischen Containern und Algorithmen. Wenn Algorithmen Iteratoren als Argument benutzen, können diese auf viele verschiedene Datenstrukturen angewendet werden, sogar wenn diese Datenstrukturen so unterschiedlich sind wie LinkedLists und Arrays. Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Hierachisches Klassendiagram: Input Bi- direktional Random- Access Forward Output Iteratoren und deren Verwendung in der STL - Iteratorkategorien Seite 8 Iteratorkategorien Zwar unterstützen fast alle Iteratoren die drei o.g. Grundoperationen *, ++ und ==, bzw. !=, jedoch gibt es natürlich eine Reihe von zusätzlichen Operationsmöglichkeiten, anhand derer man Iteratoren in fünf Kategorien unterteilen kann: Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Iteratoren und deren Verwendung in der STL – Output-Iteratoren Seite 9 BEMERKUNG: Bevor die Klassen nun im einzelnen näher vorgestellt werden, sei hier angemerkt, dass sich die Kategorien unterschiedlich gut für verschiedene programmiertechnische Probleme eignen. So kann man z.B. auch mit Random-Access Iteratoren Daten lesen, will man jedoch nur Daten lesen, ist es in Hinsicht auf die Laufzeit besser den dafür geeigneteren Input - Iterator zu verwenden. 1. Output - Iteratoren Zweck: Schreiben von Daten. Dabei werden die einzelnen Objekte einer Sequenz durch dereferenzieren beschrieben, z.B: *p = x // Das Objekt auf das der Iterator p zeigt, // übernimmt den Wert der Variablen x. Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Iteratoren und deren Verwendung in der STL - Input,- Forward-Iteratoren Seite 10 2. Input - Iteratoren Zweck: Lesen von Daten. Dabei werden die einzelnen Objekte einer Sequenz durch den Dereferenzierungsoperator * gelesen, z.B: x = *p; // Die Variable x übernimmt den Wert des // dereferenzierten Iterators p Iterator::operator()-> stellt einen Zugriff auf das Objekt dar. 3. Forward - Iteratoren Zweck: Ermöglicht einen Vorwärtsdurchlauf mit Iterator::operator ++(), sowie lesen und schreiben mit den o.g. Operatoren. Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Iteratoren und deren Verwendung in der STL – Bidirektionale Iteratoren Seite 11 4. Bidirektionale Iteratoren Zweck: Mit dem bidirektionalen Iteratoren ist es möglich, in beide Richtungen eines Containers zu wandern, sprich ein Zugriff kann nicht nur auf das Nächste, sondern auch auf das vorherige Element erfolgen • Zusätzliche Operatoren: • Zeigen auf vorheriges Element durch Iterator::operator()--, also zb.: iter-- ; --iter; BEMERKUNG: - - iter (Präfix) ist grundsätzlich schneller Anwendung auf folgende Containertypen: std::list, std::map, std::multimap, std::set, std::multiset Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Iteratoren und deren Verwendung in der STL - RandomAccess-Iteratoren Seite 12 5. RandomAccess - Iteratoren Zweck: Ist der umfassendste Iterator, der zur Anwendung kommt, wenn keine der anderen Arten eine entsprechend ausreichende Funktionalität bietet. • Zusätzliche Operatoren: • direkter Zugriff auf n-tes Element durch iter[n] • direkte Verschiebung durch iter += n; iter -= n; • arithmetisches Rechnen, z.B. iter+n; iter-n; • Abstand: iter1 – iter2; • relationale Operatoren <; >; <=; >=; Anwendung auf folgende Containertypen: std::vector, std::deque, std::string,std::array, std:valarray Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Iteratoren und deren Verwendung in der STL - Iteratoroperatoren Seite 13 Schaubild " Iteratoroperatoren“: Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier
Iteratoren und deren Verwendung in der STL - Zusammenfassung Seite 14 Schlußendlich kann man sagen, daß man seinen Code durch Benutzung von Iteratoren wesentlich typenunabhängiger und allgemeingültiger nutzen kann. Es kann nie schaden, ein mächtiges Werkzeug der Programmierung zu „beherrschen“. Für weiter- führende Informationen, nachfolgend einige Links zum Thema: Links zu Iteratoren: www.sgi.com/tech/stl/Iterators.html www.zaik.uni-koeln.de/~pipenb/libcpp_docu/iterator.html www.math.uni-goettingen.de/ascholz/komponenten/vorles/node21.html Programmierpraktikum: Generische Programmierung in C++ im WS 02/03 © Rouven Maier