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