Arrays: Der Standard C++ Typ (class) vector

Transcrição

Arrays: Der Standard C++ Typ (class) vector
C++ Seminar 2006/2007
Arrays: Der Standard C++ Typ (class) vector
Mit Hilfe des heute in C++ standarmässig vorhandenen („Container-“) Typs (oder „class“) vector ist es
möglich, Arrays zu definieren, deren Länge nicht zur Kompilationszeit (wie bei den bisher besprochenen
„C-Arrays“), sondern erst während der Programmausführung festgelegt wird. Solche Arrays werden als
„dynamisch allozierbar“ bezeichnet, weil ihre Länge, d.h. die Anzahl ihrer Komponenten und damit der zu
deren Speicherung notwendige Speicherplatz dem Compiler nicht bekannt ist, sondern erst zur Zeit der
Programmausführung festgelegt wird. Wie bei den C-Arrays, können Ihre Komponenten von einem
beliebigen Typ sein und werden genau gleich referenziert (Auch bei den vector-Arrays wird nicht
kontrolliert, dass die Indexwerte innerhalb der gegebenen Grenzen liegen!). Wird der Typ vector
verwendet, dann muss der entsprechende „Header-File“ vector wie folgt angeschlossen werden:
#include <vector>
Beispiele von Deklarationen von vector-Variablen sind:
vector <double> a( 3* N );
// Definiert ein Array mit 3*N nicht initialisierten Komponenten a[i] vom
// Typ double, wobei N eine nicht-negative Variable vom Typ int ist
vector <int> b( 33, 777 );
// Definiert ein Array mit 33 Komponenten b[0] bis b[32] vom Typ int,
// die alle mit dem Wert 777 initialisiert werden
vector <double> c = a;
// Definiert ein Array c mit gleich vielen Komponenten wie a, welche
// mit den aktuellen a[i]-Werten initialisiert werden: c[i] = a[i]
vector <float> d;
// Definiert ein Array mit (vorläufig) 0 Komponenten vom Typ float
Einige Funktionen (Methoden) des Standardtyps (class) vector
Zum C++ Standardtyp vector gehören mehrere vordefinierte Funktionen (bei Klassen oft als „Methoden“
bezeichnet). Die bei uns verwendeten Funktionen können mit folgenden Beispielen erklärt werden, die
sich auf die oberen Deklarationen beziehen:
int k = b.size();
// Die int Variable k wird mit der aktuellen Länge von b initialisiert (hier: k = 33)
d.resize( 2*N );
// Die Länge von d wird „dynamisch“ auf 2*N geändert (erhöht)).
double x = a.at(77);
// Gleiche Wirkung wie x = a[77] jedoch mit Fehlermeldung falls 77 ≥ 3*N
b.push_back( 888 );
// Die Länge von b wird um eine neue Komponente b[33]=888 zu 34 erhöht.
Matrizen als Vektoren von Vektoren
Die Komponenten einer Variable vom Typ vector können selber vom Typ vector sein. Die in der letzten
Woche gesprochene Deklaration einer Matrix mit jetzt nicht länger vordefinierten sondern variablen
Anzahl Zeilen (Anzahl_Zeilen) und Spalten (Anzahl_Spalten) kann deswegen wie folgt aussehen:
int Anzahl_Zeilen , Anzahl_Spalten;
// Deklaration der beiden int-Variablen
Anzahl_Zeilen = . . . . .
// Anzahl_Zeilen und Anzahl_Spalten,
Anzahl_Spalten = . . . . .
// die dann im Programm definiert werden
vector < vector <double> > matrix(Anzahl_Zeilen); // Deklaration eines zweidimensionalen Array
// mit Anzahl_Zeilen Vektoren, je mit (vorläufig)
// 0 Komponenten vom Typ double.
for( int i=0; i<Anzahl_Zeilen; i++ )
matrix[i].resize(Anzahl_Spalten);
// Die Länge der „Anzahl_Zeilen“ Vektoren wird dann
// zur gewünschten Länge Anzahl_Spalten erhöht.
Die Referenzierung einzelner Komponenten erfolgt nach wie vor, z.B. mit:
12.01.2007 / AV
matrix[33][44]
1/1