OO Get Together stl:container vector, map, list
Transcription
OO Get Together stl:container vector, map, list
26. Juni 2006 OO GetTogether: stl:container OO Get Together stl:container vector, map, list ... Matthias Enno Janssen, DESY 1 26. Juni 2006 OO GetTogether: stl:container Motivation häufig auftretende Problematik – – – – ein zusätzliches Element zu einem Array hinzufügen sortierte Struktur einfaches Zugreifen auf die Daten (z.B. Namen -> Telefonnummern) verallgemeinerte Algorithmen der Weg – – dynamische Strukturen standardisiertes und schnelles Zugreifen Die Lösung – Standard Template Library Matthias Enno Janssen, DESY 2 OO GetTogether: stl:container 26. Juni 2006 Standard Template Library Container – – unsortiert • vector: • list: sortiert • map: • set: generalisiertes Array doppelt verkettete Liste Menge von Objekt-Paaren (Key, Value) Menge von Objekten Iteratoren – generalisierter Zugriff auf die Objekte im Container Algorithmen – finden, sortieren, ... Matthias Enno Janssen, DESY 3 26. Juni 2006 OO GetTogether: stl:container vector Vektoren können jedes beliebige Objekt enthalten: häufig sinnvoll: definieren eines neuen Typs #include <vector> using namespace std; typedef vector<int> IntVector; typedef vector<int>::iterator IntIterator; besitzt viele verschiedene Konstruktoren IntVector IntVector IntVector IntVector v1; // leerer Vector v2(5,3); // {3,3,3,3,3} v3(v2); // Kopie von v2 v4(v2.begin()+2,v2.end()-1); Matthias Enno Janssen, DESY 4 26. Juni 2006 OO GetTogether: stl:container vector: Zugiff wahlfreier Zugriff wie beim Array: ACHTUNG kein Längencheck IntVector v5(4); //{0,0,0,0} v5[2] = 5; //{0,0,5,0} Zugriff auf das erste und letzte Element v5.front() = 6; //{6,0,5,0} v5.back() = 9; //{6,0,5,9} int x = v5.front(); Matthias Enno Janssen, DESY 5 26. Juni 2006 OO GetTogether: stl:container vector: Iteratoren Zugriff auf Elemente über Iteratoren: – Verhalten sich wie Pointer begin() end() *(v5.begin()) == v5.front(); *(v5.end()-1) == v5.back(); Iteration über alle Elemente im Vektor: for (IntIterator i = v5.begin(); i != v5.end(); ++i) { cout<<*i<<“, “; } cout<<endl; Matthias Enno Janssen, DESY 6 26. Juni 2006 OO GetTogether: stl:container vector: Einfügen und Löschen nur am Ende effizient: O(1) v5.push_back(3); v5.pop_back(); //{6,5,0,9,3} //{6,5,0,9} ineffizientes füllen überall möglich: O(n) IntVector v6(3,2); //{2,2,2} v6.insert(v6.begin()+1,4); //{2,4,2,2} v6.insert(v6.end()-2,2,7); //{2,4,2,7,7,2} v6.insert(v6.begin()+2,v5.begin(),v5.end()-2); //{2,4,6,5,0,7,7,2} Matthias Enno Janssen, DESY 7 OO GetTogether: stl:container 26. Juni 2006 vector: Einfügen und Löschen löschen von Elementen: v6.pop_back() //{2,4,6,5,0,7,7} v6.erase(v6.begin()+5);//{2,4,6,5,7,7} v6.erase(v6.begin()+2,v6.end()-3);//{2,5,7,7} – Vorsicht: Aufwand wächst linear mit Anzahl der gelöschten Elemente löschen aller Elemente: v6.clear(); Matthias Enno Janssen, DESY 8 26. Juni 2006 OO GetTogether: stl:container vector: Größe die Größe eines Vektors ist die Anzahl der Elemente: IntVector v7(3,5); //{5,5,5}; cout<<v7.size()<<endl; // 3 die Kapazität eines Vektors wird bei bedarf verdoppelt v7.capacity(); // 3; v7.push_back(9) // {5,5,5,9} v7.size() // 4 v7.capacity() // 6 und wird nie wieder verkleinert v7.clear(); v7.capacity // 6 v7.empty() // true Matthias Enno Janssen, DESY 9 26. Juni 2006 OO GetTogether: stl:container Beispiel: sortieren ein Element in einen aufsteigend sortierten Vektor einfüllen sortIntoVec(vector<type> vec, type x){ for (vector<type>::iterator i = vec.begin(); i != vec.end(); ++i) { if (*i>x){ vec.insert(i,x); return; } } vec.push_back(x); } für diesen Zweck ist eine Liste besser geeignet (vector↔list) Matthias Enno Janssen, DESY 10 26. Juni 2006 OO GetTogether: stl:container map in Maps sind die Elemente Paare aus einem Schlüssel und einem Wert #include <map> using namespace std; typedef map<string, int> TelBook; typedef pair<string, int> TelBookEntry; Vieles wie beim Vektor TelBook Desy; //leere map TelBookEntry Entry1(string(“Matthias“),3137); Desy.push_back(Entry1); Desy.push_back(TelBookEntry(string(“Benno“), 2752)); Matthias Enno Janssen, DESY 11 26. Juni 2006 OO GetTogether: stl:container map: Zugriff die Elemente werden nach den Keys sortiert, daher müssen diese die Operatoren >, <, und == unterstützen begin() < > end() alle 'offenen' Verknüpfungen' zeigen auf end() Algorithmen sorgen für ausgeglichenen Baum Matthias Enno Janssen, DESY 12 26. Juni 2006 OO GetTogether: stl:container map: Zugriff durch die Baum-Strutur ist der Zugriff schnell TelBook::iterator i = Desy.find(string(“Matthias“)); if (i !=Desy.end() ) // Eintrag wurde gefunden cout<<“Matthias :“<<i->second<<endl; das Durchlaufen aller Elemente ist bei allen Container gleich: der Zugriff auf die Elemente ist es nicht for (TelBook:iterator i = Desy.begin(); i != Desy.end(); ++i) { cout<<i->first<<“: “<<i->second<<endl; } Matthias Enno Janssen, DESY 13 26. Juni 2006 OO GetTogether: stl:container map: Zugriff auch array-ähnlicher Zugriff möglich int = Desy[string(“Benno“)]; auch einfaches Hinzufügen so möglich Desy[string(“Shiraz“)] = 3681; Suche nach einem Wert ist nur über Durchsuchen der ganzen Map möglich: Besser zweite Map nutzen typedef map<int, string> TelBookRev; TelBookRev DesyRev(); Matthias Enno Janssen, DESY 14 26. Juni 2006 OO GetTogether: stl:container Zusammenfassung STL bietet verschiedene dynamische Container-Strukturen – für jedes Problem die richtige Struktur • dymamisches Array (vector) • (sortierte) Liste (list) • Telefonbuch (map) Verwenden von Iteratoren macht den Code unabhängig vom Typ des Containers viele weitere Befehle sind für alle Container gleich – push_back, size, clear, erase ... Matthias Enno Janssen, DESY 15