Ranges und Views ab C++20
Diese Lektion benötigt C++20. Eine Range ist ein zugänglicher Bereich von Elementen. Ranges-Algorithmen können oft den ganzen Container direkt entgegennehmen, statt ein Begin-End-Paar zu verlangen.
Ranges und Views ab C++20#
Modernes C++ · Lektion 47 von 60
Voraussetzungen: Algorithmen, Lambdas. Lernziel: Du formulierst Verarbeitungsschritte als lesbare Folge und beachtest die Lebensdauer ihrer Daten.
Diese Lektion benötigt C++20. Eine Range ist ein zugänglicher Bereich von Elementen. Ranges-Algorithmen können oft den ganzen Container direkt entgegennehmen, statt ein Begin-End-Paar zu verlangen.
1#include <iostream>2#include <ranges>3#include <vector>4 5int main() {6 std::vector<int> zahlen{1, 2, 3, 4, 5, 6};7 auto ergebnis = zahlen8 | std::views::filter([](int zahl) { return zahl % 2 == 0; })9 | std::views::transform([](int zahl) { return zahl * zahl; });10 for (int wert : ergebnis) {11 std::cout << wert << '\n';12 }13}14216336filter lässt nur passende Elemente durch. transform berechnet für jedes davon einen Ergebniswert. Das Pipe-Zeichen | verbindet hier Range-Adapter, also Bausteine, die einen Bereich in einen anderen überführen. Es hat in anderen Kontexten andere Bedeutungen, beispielsweise bitweises Oder.
Lazy bedeutet aufgeschoben#
Eine View ist ein leichtgewichtiges Bereichsobjekt. Die gezeigten Views arbeiten lazy, also aufgeschoben: Sie führen Filter und Berechnung beim Durchlaufen aus, statt sofort einen neuen Vector aller Ergebnisse anzulegen.
Das spart unter Umständen Zwischenspeicher, bedeutet aber auch, dass erneutes Durchlaufen Berechnungen wiederholen kann. Führe keine unerwarteten Nebenwirkungen wie Dateischreiben in einem Filterprädikat aus. Seine Aufgabe ist die Auswahl.
Besitz nicht voraussetzen#
Die View im Beispiel bezieht sich auf zahlen. Sie verlängert dessen Lebensdauer nicht. Gib keine solche View auf einen lokalen Vector zurück, der beim Funktionsende zerstört wird. Manche Views können Daten besitzen; daraus folgt keine allgemeine Besitzgarantie für jede Kombination.
Auch Änderungen am ursprünglichen Container können Iteratoren invalidieren oder mit intern gespeicherten Positionen einer View kollidieren. Verarbeite stabile Daten und baue die View nach strukturellen Änderungen bei Bedarf neu auf.
Fehlermeldungen und Sprachversion#
std::views has not been declared kann auf einen fehlenden Header, einen falschen Sprachmodus oder fehlende Bibliotheksunterstützung hinweisen. C++20-Sprachunterstützung und die mitgelieferte Standardbibliothek müssen zusammenpassen. Zum Übersetzen wählst du etwa -std=c++20 beziehungsweise /std:c++20.
Übung#
Hat ergebnis unmittelbar nach seiner Definition schon drei gespeicherte Quadratzahlen?
Lösung
Nein. Die gezeigte Verarbeitung beschreibt, wie die Zahlen beim Durchlaufen ausgewählt und berechnet werden. Für ein dauerhaft gespeichertes Ergebnis musst du ausdrücklich in einen passenden Container sammeln.
Weiterlernen#
Zurück: Fehlende Werte und Alternativen: optional und variant · Kursübersicht · Weiter: Imports und C++20-Module
Kommentare 0
Kommentare sind für diese Seite deaktiviert.