Vektoren Flashcards
Was macht ein Vektor?
Vektoren speichern gleichartige Daten.
Was ist der erste Schritt beim Schreiben eines Programms, um Vektoren überhaupt erst verwenden zu können?
Die Vektorenbibliothek muss inkludiert werden, sprich: #𝚒𝚗𝚌𝚕𝚞𝚍𝚎 .
Wie ist ein Vektor aufgebaut, d.h. aus welchen Elementen besteht ein Vektor?
Als Beispiel:
𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚜𝚎𝚟𝚎𝚗𝚏𝚒𝚟𝚎𝚜(𝟽, 𝟻);, wobei…
… 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 der Aufruf des Vektors ist;
… der Typ der Elemente des Vektors ist;
… 𝚜𝚎𝚟𝚎𝚗𝚏𝚒𝚟𝚎𝚜 der Name des Vektors ist;
… 𝟽 die Anzahl Elemente des Vektors ist;
… 𝟻 der Initialwert der Elemente des Vektors ist.
Folglich wird mit diesem Vektor sieben mal eine “5” ausgegeben.
Sei 𝚟𝚎𝚌 ein Vektor mit 𝚃-Elementen und 𝚎𝚡𝚙 ein 𝚒𝚗𝚝-Ausdruck mit Wert i ≥ 0.
Was für ein Ausdruck ist 𝚟𝚎𝚌[𝚎𝚡𝚙]?
Ein L-Wert vom Typ 𝚃, der sich auf das i-te Element von 𝚟𝚎𝚌 bezieht.
Achtung: Die Zählung von i beginnt ab 0!
Sei 𝚟𝚎𝚌[𝚎𝚡𝚙] ein Vektor. Wie wird ein Wert i von 𝚎𝚡𝚙 genannt?
Index.
Wie wird ein Vektor gespeichert?
Ein Vektor 𝚟𝚎𝚌 wird im Speicherband an einer Adresse p gespeichert und benötigt dort einen Speicherplatz von s Zellen (s entspricht dem Speicherbedarfs des Vektortyps 𝚃, z.B. benötigen 𝚒𝚗𝚝-Typen weniger Speicher als 𝚌𝚑𝚊𝚛-Typen).
Diese s Zellen speichern dann den ersten Index vom Vektor 𝚟𝚎𝚌.
Um an die Adresse von 𝚟𝚎𝚌[i] zu gelangen, muss man folglich p + s * i rechnen.
Wie werden folgende Vektoren initialisiert?
(1) 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚟𝚎𝚌(𝟻);
(2) 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚟𝚎𝚌(𝟻, 𝟸);
(3) 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚟𝚎𝚌{𝟺, 𝟹, 𝟻, 𝟸, 𝟷};
(4) 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚟𝚎𝚌;
(1) 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚟𝚎𝚌(𝟻);
Die 5 Elemente werden mit 0 initialisiert.
(2) 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚟𝚎𝚌(𝟻, 𝟸);
Die 5 Elemente werden mit 2 initialisiert.
(3) 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚟𝚎𝚌{𝟺, 𝟹, 𝟻, 𝟸, 𝟷};
Die 5 Elemente werden mit einer Liste initialisiert.
(4) 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚟𝚎𝚌;
Ein leerer Vektor wird initialisiert.
Betrachte folgenden Programmausschnitt. Wo liegt der Fehler und was passiert?
𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛 𝚟𝚎𝚌(𝟷0);
𝚏𝚘𝚛 (𝚞𝚗𝚜𝚒𝚐𝚗𝚎𝚍 𝚒𝚗𝚝 𝚒 = 0; 𝚒 <= 𝟷0; ++𝚒)
𝚟𝚎𝚌[𝚒] = 𝟹0;
Der Vektor hat aufgrund seiner Grösse von 10 nur 10 Elemente, die bei Null beginnen, also 0 bis 9.
In der 𝚏𝚘𝚛-Schleife wird jedoch auf den Index 10 zugegriffen, was nicht möglich ist. Es kommt somit zu einem Laufzeit-Fehler und zu undefiniertem Verhalten.
Was ist bei der Verwendung von Indexoperatoren [] sehr wichtig, zu beachten?
Bei der Verwendung eines Indexoperators auf einem Vektor ist es die alleinige Verantwortung des Programmierers, die Gültigkeit aller Elementzugriffe zu prüfen.
Wie initialisiert man eine Matrix, d.h. einen mehrdimensionalen Vektor, in C++?
Um eine Matrix zu initialisieren verwendet man Vektoren von Vektoren (von Vektoren von…). So wird folglich an jedem Speicherpunkt des Vektors n ein weiterer Vektor gespeichert m gespeichert und man erhält eine m×n-Matrix.
Betrachte folgenden Vektor (bzw. Matrix):
𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛> 𝚖 = { {"𝚉𝙷", "𝙱𝙴", "𝙻𝚄", "𝙱𝚂", "𝙶𝙴"}, {"𝙵𝚁", "𝚅𝙳", "𝚅𝚂", "𝙽𝙴", "𝙹𝚄"}, {"𝙰𝚁", "𝙰𝙸", "𝙾𝚆", "𝙸𝚆", "𝚉𝙶"} };
Wie viele Zeilen und Spalten hat diese Matrix?
Welcher Kanton wird an der Stelle 𝚖[𝟷][𝟸] ausgelesen?
Diese Matrix hat 3 Spalten und 5 Zeilen, dies kann man ganz einfach an den Listen ablesen (3 Listen à 5 Elementen).
Die Stelle 𝚖[𝟷][𝟸] wird zu 𝚅𝚂 ausgewertet.
(Beachte, dass die Nummerierung bei 0 beginnt.)
Wie würde man eine beliebige a×b-Matrix initialisieren, bei der alle Einträge zu “1” ausgewertet werden sollen?
𝚞𝚗𝚜𝚒𝚐𝚗𝚎𝚍 𝚒𝚗𝚝 𝚊 = …; 𝚞𝚗𝚜𝚒𝚐𝚗𝚎𝚍 𝚒𝚗𝚝 𝚋 = …;
𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛>
𝚖(𝚊, 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛(𝚋, 𝟷));
Wobei 𝚖 ein Vektor der Länge a ist, dessen Elemente Vektoren der Länge b sind.
Wie umgeht man das Problem, dass für beliebig grosse Matrizen die Initialisierung sehr lange werden kann?
Man arbeitet mit Typ-Aliassen, z.B.:
𝚞𝚜𝚒𝚗𝚐 𝚒𝚖𝚊𝚝𝚛𝚒𝚡 = 𝚜𝚝𝚍::𝚟𝚎𝚌𝚝𝚘𝚛>;
Danach kann man nur noch mit dem Alias arbeiten, z.B.:
𝚟𝚘𝚒𝚍 𝚙𝚛𝚒𝚗𝚝(𝚌𝚘𝚗𝚜𝚝 𝚒𝚖𝚊𝚝𝚛𝚒𝚡& 𝚖, 𝚜𝚝𝚍::𝚘𝚜𝚝𝚛𝚎𝚊𝚖& 𝚘𝚞𝚝);
𝚒𝚗𝚝 𝚖𝚊𝚒𝚗() {
𝚒𝚖𝚊𝚝𝚛𝚒𝚡 𝚖 = …;
𝚙𝚛𝚒𝚗𝚝(𝚖, 𝚜𝚝𝚍::𝚌𝚘𝚞𝚝);
}