C++
VeröffentlichtRevision 1

Feste Arrays, C-Arrays und std::span

Ein Array ist eine Folge von Elementen eines Typs. std::array<T, N> aus <array> hat eine beim Übersetzen bekannte, feste Elementanzahl N. Anders als ein Vector wächst es nicht mit push_back.

Feste Arrays, C-Arrays und std::span#

Daten sammeln und verarbeiten · Lektion 28 von 60

Voraussetzungen: Vector. Lernziel: Du wählst zwischen fester und veränderbarer Elementanzahl.

Ein Array ist eine Folge von Elementen eines Typs. std::array<T, N> aus <array> hat eine beim Übersetzen bekannte, feste Elementanzahl N. Anders als ein Vector wächst es nicht mit push_back.

C++
1#include <array>2#include <iostream>3 4int main() {5    std::array<int, 3> temperaturen{18, 20, 19};6    for (int temperatur : temperaturen) {7        std::cout << temperatur << '\n';8    }9    std::cout << "Anzahl: " << temperaturen.size() << '\n';10}

temperaturen.at(1) liefert 20. Die 3 ist Teil des Typs: std::array<int, 3> und std::array<int, 4> sind verschiedene Typen. Bei std::array<int, 3> werte{}; werden die drei Zahlen mit null initialisiert.

C-Arrays verstehen#

Die eingebaute Schreibweise int werte[3]{1, 2, 3}; heißt häufig C-Array, weil sie auch aus C bekannt ist. Es fehlen bequeme Memberfunktionen wie .size() und .at(). In vielen Ausdrücken wird ein solches Array zu einem Zeiger auf sein erstes Element umgewandelt. Diese Array-to-pointer conversion, oft Decay genannt, überträgt die Elementanzahl nicht automatisch mit.

Ein Parameter int werte[] ist daher kein eigenständiger Parameter mit bekannter Arraylänge. Für neue Schnittstellen eignen sich ein passender Container, eine Referenz mit bekanntem Typ oder später std::span besser.

Ausblick: span ab C++20#

std::span aus <span> ist eine Sicht auf eine zusammenhängende Elementfolge. Eine Sicht besitzt die Elemente nicht selbst. Sie merkt sich den Zugriff und die Länge. Damit kann eine Funktion beispielsweise sowohl ein Array als auch einen Vector betrachten.

Ein Span verlängert die Lebensdauer seiner Elemente nicht. Wird die ursprüngliche Sammlung zerstört oder ihr Speicher verlagert, kann die Sicht ungültig werden. Auch der übliche span[index]-Zugriff unter C++20 ersetzt keine eigene Grenzprüfung.

Übung#

Welche Sammlung passt zu genau sieben Wochentemperaturen und welche zu beliebig vielen eingelesenen Messwerten?

Lösung

Für sieben fest vorgegebene Werte passt std::array<double, 7>. Für eine erst zur Laufzeit bestimmte Anzahl passt std::vector<double>.

Weiterlernen#

Zurück: Veränderbare Listen mit std::vector · Kursübersicht · Weiter: Schlüssel, Werte und Mengen: map und set

Mitwirkende 1

Menschen, deren Änderungen in dieser Seite veröffentlicht wurden.

Kommentare 0

Kommentare sind für diese Seite deaktiviert.