Veränderbare Listen mit std::vector
Ein Container ist ein Datentyp, der andere Werte verwaltet. std::vector aus <vector> enthält eine zusammenhängend gespeicherte Folge von Elementen. Element nennt man einen einzelnen enthaltenen Wert. Die Anzahl kann während der Laufzeit wachsen und schrumpfen.
Veränderbare Listen mit std::vector#
Daten sammeln und verarbeiten · Lektion 27 von 60
Voraussetzungen: Schleifen, Parameter. Lernziel: Du speicherst beliebig viele gleichartige Werte in einer verwalteten Sammlung.
Ein Container ist ein Datentyp, der andere Werte verwaltet. std::vector aus <vector> enthält eine zusammenhängend gespeicherte Folge von Elementen. Element nennt man einen einzelnen enthaltenen Wert. Die Anzahl kann während der Laufzeit wachsen und schrumpfen.
1#include <iostream>2#include <vector>3 4int main() {5 std::vector<int> punkte{10, 20, 30};6 punkte.push_back(40);7 for (int punktzahl : punkte) {8 std::cout << punktzahl << '\n';9 }10 if (!punkte.empty()) {11 std::cout << "Erster Wert: " << punkte.at(0) << '\n';12 }13}<int> legt den Elementtyp fest. Diese Schreibweise verwendet eine Templatevorlage, eine Typvorlage, aus der hier ein Container für ganze Zahlen entsteht. Templates behandeln wir später ausführlich. push_back hängt ein Element an das Ende an.
Die Bereichsschleife#
for (int punktzahl : punkte) ist eine Bereichsschleife, englisch range-based for. Sie besucht nacheinander alle Elemente. Hier wird jede Zahl in den Schleifenparameter kopiert. Mit auto& kannst du Originalelemente verändern, mit const auto& größere Elemente ohne Kopie lesen.
Größe und Kapazität#
size() liefert die aktuelle Elementanzahl. capacity() beschreibt, wie viele Elemente ohne erneute Speicherbeschaffung hineinpassen. reserve(100) fordert Kapazität an, erzeugt aber keine 100 Elemente. resize(100) verändert die Größe und erzeugt beziehungsweise entfernt Elemente.
Reallokation bedeutet, dass ein neuer Speicherbereich beschafft und der bisherige Inhalt dorthin übertragen wird. Dabei werden alte Zeiger, Referenzen und Iteratoren auf Vektorelemente ungültig. Diese Zugriffsformen lernst du in den folgenden Kapiteln kennen. Speichere solche Verweise nicht über möglicherweise wachsende Operationen hinweg.
Grenzen und Kosten#
Für tatsächliche Elemente gilt index < size(). at() prüft, [] führt keine entsprechende Ausnahmeprüfung durch. front() und back() benötigen einen nichtleeren Vector. pop_back() entfernt das letzte Element und braucht ebenfalls einen vorhandenen Wert.
Zugriff über einen Index ist schnell und unabhängig von der Elementanzahl. Einfügen in der Mitte kann dagegen viele Elemente verschieben. Wähle vector als guten Ausgangspunkt für geordnete Datenfolgen und ändere den Container erst aus einem konkreten Grund.
Übung#
Wie viele Elemente enthält ein leerer Vector nach reserve(20)?
Lösung
Weiterhin null. Es wurde Platz vorbereitet. Erst Operationen wie push_back oder resize erzeugen Elemente.
Weiterlernen#
Zurück: Rekursion und einfache Abbruchfälle · Kursübersicht · Weiter: Feste Arrays, C-Arrays und std::span
Kommentare 0
Kommentare sind für diese Seite deaktiviert.