190 likes | 309 Views
Repetitorium PG1 05.09. - 09.09.2005. 4: Standard Template Library FH-Darmstadt, FB Informatik. Übersicht. STL-Funktionen vector Suchen Sortieren Templates. STL - include. #include <iostream> // ist bekannt #include < algorithm > // für fill #include < numeric > // für accumulate
E N D
Repetitorium PG105.09. - 09.09.2005 4: Standard Template Library FH-Darmstadt, FB Informatik
Übersicht • STL-Funktionen • vector • Suchen • Sortieren • Templates Dipl. Inf. (FH) Michael Krauß
STL - include #include <iostream> // ist bekannt #include <algorithm> // für fill #include <numeric> // für accumulate using namespace std; besser: using std::cin; using std::cout; Dipl. Inf. (FH) Michael Krauß
fill int a2[SIZE]; // ,->Füll-Objekt fill( &a2[0], &a2[SIZE], 1 ); /* '&' Adress-Operator (Achtung: Nicht verwechseln mit "call by reference"! ) Ersetzt jedes Element im Bereich durch eine Kopie des übergebenen Objekts (<algorithm>) */ cout << "a2: "; show(a2) Dipl. Inf. (FH) Michael Krauß
weitere… • copy( &a1[0], &a1[SIZE], &a2[0] ); //Kopiert Elem. von einem Bereich in einen anderen(<algorithm>) • swap_ranges( &a1[0], &a1[SIZE], &a2[0] ); // Tauscht Elemente 2er Bereiche aus (<algorithm>) • cout << accumulate( &a1[0], &a1[SIZE], 0 ) << endl; // Addiert alle Elemente eines Bereichs (<algorithm>) Dipl. Inf. (FH) Michael Krauß
…noch weitere • partial_sum( &a1[0], &a1[SIZE], &a3[0] ); // Berechnet die Partialsummen der Arrayelemente und legt sie im Bereich beginnend bei a1[0] ab. • reverse( &a3[0], &a3[SIZE] ); // Invertiert die Reihenfolge der Elemente im Bereich • random_shuffle( &a3[0], &a3[SIZE] ); // Ordnet Elemente des Bereichs zufällig um. Dipl. Inf. (FH) Michael Krauß
Klasse vector • vordefinierter abstrakter Datentyp für komfortable 1d-Arrays • (#include <vector>) • Containerklasse. Container enthalten und verwalten eine Menge von Objekten. • sequentieller Container • homogener Datentyp, alle Elemente vom gleichen Typ • dynamische Datenstruktur, zur Laufzeit ihre Größe ändern • wahlfreien Zugriff auf Elemente mit []-Operator • Daten schnell sortieren, lesen und schreiben Dipl. Inf. (FH) Michael Krauß
Deklaration • std::vector <type> v; • type: int, float, Account etc. • vector functions • vector<type> v(&a[0], &a[SIZE]) //Creates vector • v.size() //Current size of vector • v.capacity() //size before reallocating memory • v.clear() //Erases entire container • v.push_back(value) //Add element to end • v.front(), v.back() //Return first and last element • v[elementNumber] = value; //Assign value to an element • v.at[elementNumber] = value; //range checking, out_of_bounds exc. • v.reserve(n); //makes the capacity of v at least n Dipl. Inf. (FH) Michael Krauß
Beispiel std::vector< int > intVector;//Objekt mit int-Werten erzeugen cout << "Anzahl gespeicherter Elemente zu Beginn: „ << intVector.size() << "\nAnzahl reservierter Speicherplaetze: " << intVector.capacity(); // Funktion push_back kennt jede Sequenz-Containerklasse intVector.push_back( 2 ); Dipl. Inf. (FH) Michael Krauß
STL-Fkt. für vector-Objekte #include <iostream> #include <algorithm> #include <numeric> #include <vector> using namespace std; void main () { // Erzeugt vector v1 mit Elementen des Arrays a bis zu (aber nicht einschließlich) a[SIZE] In der STL sind Elemement-Bereiche immer als ein rechtsseitig offenes Intervall definiert: [1. Element, … , 1.Element nach dem Ende) vector <int> v1( &a1[0], &a1[SIZE] ); // Erzeugt vectors aus SIZE Elementen mit Wert 0 vector <int> v2(SIZE,0), v3(SIZE,0); // Anwendung von fill analog zur Anwendung mit Arrays fill( &v2[0], &v2[SIZE], 1 ); // vector-Objekte sind gut vorbereitet: begin() und end() sind Akzessoren, welche die Adressen zurückliefern. fill( v2.begin(), v2.end(), 1 ); } Dipl. Inf. (FH) Michael Krauß
Suchen und Aufwand • Aufwand • konstant • linear • quadratisch • logarithmisch • exponentiell Dipl. Inf. (FH) Michael Krauß
Suche und Aufwand • Linerares Suchen • linearer Aufwand • Binäres Suchen • logarithmischer Aufwand Dipl. Inf. (FH) Michael Krauß
gefunden = FALSE anfang = 1 ende = n SOLANGE ( anfang <= ende ) && ( ! gefunden ) pos = ( anfang + ende ) / 2 f [pos] > w ? ja nein f [pos] < w ? ja nein ende = pos - 1 gefunden = TRUE anfang = pos +1 Binäres Suchen Dipl. Inf. (FH) Michael Krauß
Sortieren • Sortieren ist ein Vorgang, der eine Gruppe von ähnlichen Informationen in auf oder absteigender Folge anordnet. • Bubble Sort • Insertion Sort • Selection Sort • Quick Sort (Partition-Exchange-Sort) Dipl. Inf. (FH) Michael Krauß
links = l rechts = r grenzwert = feld [ ( l + r ) / 2 ] SOLANGE feld [ links ] < grenzwert links = links + 1 SOLANGE feld [ rechts ] > grenzwert rechts = rechts - 1 links <= rechts ? ja nein links < rechts ? ja nein hilfe = feld [ links ] feld [ links ] = feld [ rechts ] feld [ rechts ] = hilfe links = links + 1 rechts = rechts - 1 SOLANGE links <= rechts l < rechts ? ja nein sort ( l, rechts ) r > links ? ja nein sort ( links, r ) Quick Sort Dipl. Inf. (FH) Michael Krauß
Sortieralgorithmen der STL • STL stellt 3 generische Sortieralgorithmen zur Verfügung: • sort, stable_sort und partial_sort. Alle sind als Funktions-Template typunabhängig implementiert. • Vorbedingung: • sequentielle Container (z.B C-Array, string, vector, … ) • Verwendete Ordnungsrelation: • operator< für den Elementtyp (default) oder benutzerdefiniert (Predicate-Objekt; siehe PG2) Dipl. Inf. (FH) Michael Krauß
Templates… • C++ unterscheidet zwischen Funktionstemplates(dieses Kapitel) und Klassentemplates • C++ Templates ermöglichen generische Programmierung. Das ist Programmierung unabhängig vom speziellen Objekt-Typ • Templates sind Schablonenmit parametrisierten Datentypend.h. mit Platzhaltern für Typen (Typ-Parameter oder Proxy-Parameter oder Wild-Card-Parameter). Dipl. Inf. (FH) Michael Krauß
Templates… • So wie Funktionen zur Laufzeit die deklarierten Parameter übergeben bekommen, werden bei Templates dem Compiler zur Compilezeit die deklarierten Typparameter übergeben. • Dieser setzt die übergebenen Aktual-Typparameter dann anstelle der Platzhalter-Typen ein. Dipl. Inf. (FH) Michael Krauß
Beispiel für Templates • früher: void swap( int& a, int& b ) { int tmp(a); a = b; b = tmp ; } • jetzt: template < class T > void swap( T& a, T& b ){ T tmp(a); a = b; b = tmp ; } void main(){ int a=5, b=6; swap( a , b ); double x=2.0, y=3.0; swap( x , y ); swap( a , x ); } Dipl. Inf. (FH) Michael Krauß