Standard Template Librar y Übersicht

Сomentários

Transcrição

Standard Template Librar y Übersicht
Standard Template Librar y
Übersicht
• STL
– Library mit allgemeinen Datenstrukturen und Algorithmen
– Bestandteil der Standard-Librar y im ISO/ANSI-Standard
– Unterstützt generisches Programmieren
• Template-Klassen und Template-Funktionen
• Wichtige STL-Komponenten
– Container-Klassen
• vector, list, set, map, etc. (ISO/ANSI: string)
– Generische Algorithmen
• find, sor t, reverse, for_each, etc.
• Unabhängig von Container-Classen (keine Member-Functions)
– Iteratoren
• Verallgemeiner tes Pointer-Konzept
© 2005 AG Rechnernetze
5-stl.1
Standard Template Librar y
Container-Klassen
• Sequence-Container
– Alle Objekte linear angeordnet
• vector<T>
– Variable Länge; random access; O(1)-insert/delete am Ende
• deque<T>
– Wie vector, O(1)-inser t/delete am Anfang und Ende
• list<T>
– Variable Länge; O(n)-access; O(1)-insert/delete an jeder Stelle
• T a[n]
– Normale C++-Arrays; feste Länge
– Alle generischen Algorithmen auch auf Arrays definier t
© 2005 AG Rechnernetze
5-stl.2
Standard Template Librar y
Container-Klassen
• Sortierte, assoziative Container
– Objekt-Zugriff über Key
– Zeitbedarf für Zugriff O(log N)
• set<Key>
• multiset<Key>
– Mengen von Keys
– Mehrere Kopien bei multiset; eindeutig bei set
• map<Key, T>
• multimap<Key, T>
– Assoziative Tabellen (Hash-Tabellen)
– Z. B. Zuordnung Name → Telefonnummer
© 2005 AG Rechnernetze
5-stl.3
Standard Template Librar y
Vector-Klasse
#include <iostream>
#include <vector>
vector<char> vec(char *s) {
vector<char> v;
while (*s != ’\0’)
v.push_back(*s++);
return v;
}
int main() {
vector<char> v = vec("hello");
cout << v.size() << endl;
vector<double> d(10, 3.141);
cout << d[3] << endl;
vector<Employee> e(20);
© 2005 AG Rechnernetze
5-stl.4
Standard Template Librar y
Vector-Klasse
#include <iostream>
#include <map>
#include <vector>
int main() {
map<char * ,long> telefonbuch;
telefonbuch["polizei"] = 110;
telefonbuch["Uni"] = 2187595;
telefonbuch["Uni Fax"] = 2187000;
cout << telefonbuch["Uni"] << endl;
telefonbuch.erase("Uni");
vector<map <char *, long> > telefonbuecher;
© 2005 AG Rechnernetze
5-stl.5
Standard Template Librar y
Iteratoren
#include <algorithm>
int main() {
vector<char> v = vec("hello");
sort(v.begin(), v.end());
– begin() und end() liefern Iteratoren
vector<char>::iterator begin(), end();
– Verallgemeiner tes Pointer-Konzept
– Iterator-Paar first und last definier t Iterator-Range:
[first, last)
– Auch normale Pointer sind Iteratoren:
int a[5] = { 12, 3, -4, 7, 0 };
sort(a, a+5);
© 2005 AG Rechnernetze
// sort(&a[0], &a[5])
5-stl.6
Standard Template Librar y
Iteratoren
• Iterator-Konzept
– Iteratoren entkoppeln Algorithmen von Container-Klassen
– Ermöglichen generische Funktionen
– sor t() keine Memberfunktion!
• Beispiel: generische find()-Funktion
– Suchen eines Elements in Arrays, Vektoren, Listen...
template <class Iterator, class T>
Iterator find(Iterator first, Iterator last, const T& value) {
while (first != last && *first != value)
++first;
return first;
}
© 2005 AG Rechnernetze
5-stl.7
Standard Template Librar y
Iteratoren
• Beispiel: generische find()-Funktion
vector<char> v = vec("hello");
vector<char>::iterator result;
...
if ((result = find(v.begin(), v.end(), ’h’)) == v.end())
// not found...
– find() kann auch auf Arrays angewendet werden
– Instantiierung z. B. für int* möglich:
int* find(int* first, int* last, const int& value) {
while (first != last && *first != value)
++first;
return first;
}
© 2005 AG Rechnernetze
5-stl.8
Standard Template Librar y
Iteratoren
• Anforderungen an Iteratoren
– Womit kann der Iterator-Typ in find() instantiier t werden?
• int*, double*
→ OK
• int, double
→ Nein, Operation *first undefinier t
– Interatoren in find() müssen diese Operationen unterstützen:
✘ first != last
✘ ++first
(auch Postfix)
✘ *first
(lesender Zugriff)
– Anforderungen erfüllt von:
• Normale Pointer-Typen
• vector<char>::iterator, etc.
• Input-Iterator
– Familie von Typen, die diese Anforderungen erfüllen
© 2005 AG Rechnernetze
5-stl.9
Standard Template Librar y
Iterator-Hierarchie
Input Iterator
Output Iterator
read-only
write-only
Forward Iterator
a++ ++a a==b a!=b *a
Bidirectional
Iterator
Forward Iterator
a-- --a
Random Access
Iterator
Bidirectional Iterator
a+i i+a a-i a+=i a-=i
a-b a<b a>b a<=b a>=b

Documentos relacionados