19. STL Container Programmieren / Algorithmen und Datenstrukturen 2 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt Wintersemester 2012 / 2013 1
Agenda Kontrollfragen STL Container: Übersicht Übung Assoziative Container: map Übung 2
Kontrollfragen Was bedeutet Design by Contract? Wer schließt einen Vertrag mit wem ab? Wo wird der Vertrag beschrieben? Was sind Vorbedingungen? Wer muss sie einhalten? Was sind Nachbedingungen? Wer muss sie einhalten? Wie sollte man mit Vertragsverletzungen umgehen (defensives Programmieren)? 3
Agenda Kontrollfragen STL Container: Übersicht Übung Assoziative Container: map Übung 4
C++ Standard Template Library (STL) Eine der beliebtesten C++- Klassenbibliotheken Ergebnis jahrelanger Forschungs- und Entwicklungsarbeit bei Hewlett-Packard Verlässliche, erprobte Komponenten Konsistente, gut verständliche Architektur 1994 standardisiert (ISO/IEC 14882) http://www.cplusplus.com/reference/stl/ 5
Behälter (Container) A container is a holder object that stores a collection other objects (its elements). They are implemented as class templates, which allows a great flexibility in the types supported as elements. The container manages the storage space for its elements and provides member functions to access them, either directly or through iterators. Containers replicate structures very commonly used in programming: dynamic arrays (vector), queues (queue), stacks (stack), heaps (priority_queue), linked lists (list), trees (set), associative arrays (map)... Quelle: http://www.cplusplus.com/reference/stl/ 6
Übersicht Container-Klassen STL Quelle: http://www.cplusplus.com/reference/stl/ 7
8
9
Elemente eines Containers iterieren (1/2) Für Container mit Direktzugriff mittels operator[ ] (z.b. Vector): for (unsigned int i = 0; i < v.size(); ++i) { sum += v[i]; } Mittels Iterator (funktioniert für alle STL Container): for (vector<float>::iterator it = v.begin(); it < v.end(); ++it) { sum += *it; } Einfacher in C++11 mit auto (Typ Inferenz) 10 for (auto it = v.begin(); it < v.end(); ++it) { sum += *it; } Compiler setzt automatisch korrekten Datentyp des Iterators ein
Elemente eines Containers iterieren (2/2) Noch einfacher mittels erweiterter for Schleife in C++11: for (float x : v) { sum += x; } Bzw. mit auto (Typ Inferenz): Schleifenvariable wird jeweils auf nächstes Element gesetzt for (auto x : v) { sum += x; } Bzw. mittels Call-By-Reference: for (auto &x : v) { sum += x; } 11
C++11 in NetBeans aktivieren Project Properties C++ Compiler 12
Weiterführende Literatur B. Stroustrup: The C++ Programming Language 3rd Edition http://www.ib.cnea.gov.ar/~oop/biblio/bjarne_stroustrup_- _The_C++_Programming_Language_3rd_Ed.pdf - 3.7 Containers - 3.8.1 Use of Iterators - 16. Library Organization and Containers 13
Agenda Kontrollfragen STL Container: Übersicht Übung Assoziative Container: map Übung 14
Übung Angelehnt an: B. Stroustrup: The C++ Programming Language, 16.5 15 1. Create a vector<char> containing the letters of the alphabet in order. Print the elements of that vector in order and in reverse order 2. Create a vector<string> and initialize it with some names of fruits. Sort the list. 3. Using the vector from exercise 2, select the names of all fruits with the initial letter 'a'. 4. Using the vector from exercise 2, write a loop to delete all fruits with the initial letter 'a'. 5. Using the vector from exercise 2, write a loop to delete all citrus fruits. 6. Using the vector from exercise 2, write a loop to delete all fruits that you don't like.
Agenda Kontrollfragen STL Container: Übersicht Übung Assoziative Container: map Übung 16
Assoziative Container: map Sequence of (key,value) pairs that provides for fast retrieval based on the key Each key in a map is unique Requires that a less-than operation (<) exists for its key types Keeps its elements sorted so that iteration occurs in order Quelle: B. Stroustrup: The C++ Programming Language, 17.4 Siehe http://www.cplusplus.com/reference/map/map/ 17
Operator[ ] Beispiel: Telefonbuch #include <map> #include <string> map<string, string> phonebook; phonebook["meier"] = "123"; phonebook["müller"] = "456"; phonebook["huber"] = "789"; Einfügen von Key-Value- Paaren in die Map Auslesen des Values für einen existierenden Key string number = phonebook["müller"]; // 456 18
Zugriff mittels at Achtung: bei nicht existierendem Element, z.b. number = phonebook["blabla"]; wird ein neues Element (in diesem Fall "") eingefügt (!) Abhilfe: Methode at (C++11) wirft out_of_range exception bei nicht vorhandenem Element try { number = phonebook.at("blabla"); } catch (out_of_range& ex) { // alternative logic... } 19
Low-level Zugriff mit insert, find Beispiel: Telefonbuch: map<string, string> phonebook; Einfügen von Key-Value- Paaren in die Map phonebook.insert( pair<string, string>("meier", "123")); phonebook.insert( pair<string, string>("müller", "456")); phonebook.insert( pair<string, string>("huber", "789")); auto result = phonebook.find("meier"); if (result!= phonebook.end()) { string number = result->second; } find liefert einen Iterator auf ein pair Prüfung auf Existenz durch Vergleich mit end() 20 auto result = phonebook.find("blabla"); if (result!= phonebook.end()) { string number = result->second; }
Mmber Functions 21
Agenda Kontrollfragen STL Container: Übersicht Übung Assoziative Container: map Übung 22
Übung: Histogramm Zählen Sie die Häufigkeit von Worten in einer Liste / Vector und geben Sie diese als map<string, int> zurück, z.b.: - Input: {Apfel, Birne, Apfel, Banane} - Output: Apfel 2, Birne 1, Banane 1 Gestalten Sie die Außensicht sorgfältig (Klasse? / Funktion? / Eingabeparameter? / Rückgabe?) 23