Im aktuellen Beitrag befassen wir uns mit der Verwendung des dynamischen Containers std::vector. Dieser kann im Gegensatz zu std::array zur Laufzeit vergrößert und verkleinert werden.
Zuerst binden wir wie gewohnt die benötigten Header Dateien ein:
1 2 |
#include <iostream> //std::cout #include <vector> //std:vector |
Innerhalb unserer main()
Funtion initialisieren wir zunächst den vector iVector
und legen seine Größe mit zehn Elementen fest. Der Typ vector setzt standardmäßig alle Elemente auf den Wert null. Wir können nun den Wert einzelner Elemente manuell verändern. Wie bei den anderen Standard Containern ist dies möglich mit Hilfe der Funktion at()
oder mit dem Arrayoperator []
. Für die Ausgabe von iVector
verwenden wir das Schlüsselwort const
, da wir nur lesend auf den Container zugreifen wollen. Die Ausgabe zeigt, dass nach den manuell gesetzten Elementen alle restlichen den Wert null haben.
1 2 3 4 5 6 7 8 9 10 11 |
// vector initialisieren und Werte zuweisen std::vector<int> iVector(10); iVector[0] = 10; iVector.at(1) = 11; iVector[2] = 12; for (const auto &i : iVector) { std::cout << i << ' '; } std::cout << std::endl; |
10 11 12 0 0 0 0 0 0 0
Wie bereits im Artikel zu std::array erwähnt, bietet die Funktion at()
Schutz vor einem etwaigen Speicherüberlauf. Mit Hilfe einer Ausnahmebehandlung können wir sicher überprüfen, ob es möglich ist, auf ein bestimmtes Element lesend oder schreibend zuzugreifen. In unserem Fall versuchen wir den Wert des 11ten Elementes zu verändern. Da iVector
jedoch nur zehn Elemente hat, wird die Ausnahme std::out_of_range
abgefangen und die entsprechende Fehlermeldung ausgegeben.
1 2 3 4 5 6 7 8 9 |
// auf Wert Außerhalb der Größe zugreifen try { iVector.at(10) = 1; } catch(std::out_of_range &range) { std::cerr << range.what() << std::endl; } |
vector::_M_range_check: __n (which is 10) >= this->size() (which is 10)
Im nächsten Beisiel verändern wir die Größe von iVector
. Zunächst fügen wir ein Element mit dem Wert 20 hinzu (push_back(20)
). Nun ist es möglich auf das 11te Element lesend zuzugreifen. Anschließend verkleinern wir den Container mit pop_back()
. Durch die Ausgabe der Größe des Containers mit size()
erkennen wir, dass sich die Länge zuerst um eins erhöht und dann wieder verringert.
1 2 3 4 5 6 7 |
// vector vergrößern und verkleinern iVector.push_back(20); std::cout << iVector.at(10) << std::endl; std::cout << "Vector Size: " << iVector.size() << std::endl; iVector.pop_back(); std::cout << "Vector Size: " << iVector.size() << std::endl; |
20
Vector Size: 11
Vector Size: 10
Zu Schluss sehen wir uns eine weitere Methode der Initialisierung an. Wenn wir einen vector mit mehreren Elementen erstellt haben, kann dessen Inhalt für Erstellung eines weiteren vectors verwendet werden. Dazu stehen die Iteratoren std:begin()
und std::end()
zur Verfügung. Diese zeigen auf den Beginn bzw. das Ende eines Containers. Schreiben wir diese nun in unsere Initialisierungsliste von cVector_copy
wir damit der gesamte Inhalt von cVector
übernommen. Dies wird durch die Ausgabe von cVector_copy
erkennbar.
Werden nicht alle Elemente des originalen Containers benötigt, kann die genaue Anzahl spezifiziert werden. Für die Erzeugung von fVector_copy
werden nur zwei Elemente von fVector
übernommen. Dies wird durch die Parameter fVector.begin() + 1
und fVector.begin() + 3
festgelegt. Wir beginnen mit dem Kopieren erst nach dem ersten Element von fVector
und stoppen beim dritten Element. Somit werden bei der anschließenden for Schleife nur die Werte 2.2 und 3.3 ausgegeben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Inhalt von cVector in cVector_copy kopieren std::vector<char> cVector {10,20,30,40,50,60}; std::vector<char> cVector_copy {cVector.begin(), cVector.end()}; for (const auto &i : cVector_copy) { std::cout << (int)i << ' '; } std::cout << std::endl; // Drei Elemente von fVector nach fVector_copy kopieren std::vector<float> fVector {1.1, 2.2, 3.3, 4.4, 5.5}; std::vector<float> fVector_copy {fVector.begin() + 1, fVector.begin() + 3}; for (const auto &i : fVector_copy) { std::cout << i << ' '; } std::cout << std::endl; |
10 20 30 40 50 60
2.2 3.3
Die Compilierung des Beispieles erfolgt mit:
g++ -std=c++11 cpp_std_vector.cpp
Das komplette Beispiel herunterladen: cpp_std_vector.zip
Hinterlasse jetzt einen Kommentar