kennen:include:ranges
no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Vorhergehende ÜberarbeitungNächste Überarbeitung | |||
— | kennen:include:ranges [2024-02-11 17:20] – [Sichten] rrichter | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== < | ||
+ | Bereiche (ab [[..: | ||
+ | Im Namensraum '' | ||
+ | definierte Sichten auf Bereiche lassen sich über Pipes '' | ||
+ | Sie liefern die Werte eines Bereiches einzeln auf Anforderung. | ||
+ | <code cpp views_pipelines.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | using namespace std::views; | ||
+ | | ||
+ | auto output = | ||
+ | iota(1) | ||
+ | | filter([](int x){ return x%2 == 0; }) | ||
+ | | transform([](int x){ return 3*x; }) | ||
+ | | take(10); | ||
+ | |||
+ | // no calculation is done up to here (lazy evaluation) | ||
+ | |||
+ | for (auto e : output) std::cout << e << ' '; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Anfang und Ende eines Views müssen nicht denselben Typ besitzen. Werden Iteratoren des selben Typs benötigt, können diese mit '' | ||
+ | |||
+ | <code cpp views_common.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | using namespace std::views; | ||
+ | | ||
+ | auto numbers = iota(1, 10) | common; | ||
+ | auto v = std:: | ||
+ | | ||
+ | for (auto e : v) std::cout << e << ' '; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Fabriken ===== | ||
+ | erzeugen Bereiche. | ||
+ | |||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
+ | <code cpp istream_view.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | auto input = std:: | ||
+ | auto below_5 = std:: | ||
+ | | std:: | ||
+ | |||
+ | for (auto e : below_5) std::cout << e << ' '; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Sichten ===== | ||
+ | übernehmen einen Bereich, verarbeiten dessen Elemente '' | ||
+ | |||
+ | ^ ^ ^ seit ^ | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | | | | | ||
+ | | '' | ||
+ | | '' | ||
+ | | | | | | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | | | | | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
+ | * ° : seit C++20 | ||
+ | * ³ : seit C++23 | ||
+ | |||
+ | ===== Beispiele ===== | ||
+ | |||
+ | <code cpp views_examples.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include <map> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | template < | ||
+ | void show(Range&& | ||
+ | { | ||
+ | std:: | ||
+ | std::cout << std::left << message << | ||
+ | int cnt = 0; | ||
+ | for (auto&& | ||
+ | { | ||
+ | std::cout << (cnt++ ? ",":"" | ||
+ | std::cout << e; | ||
+ | } | ||
+ | std::cout << " | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | void show_range_of_ranges(Range&& | ||
+ | { | ||
+ | std:: | ||
+ | std::cout << std::left << message << " : ["; | ||
+ | int cnt = 0; | ||
+ | for (auto&& | ||
+ | { | ||
+ | std::cout << (cnt++ ? ",":"" | ||
+ | int inner_cnt = 0; | ||
+ | for (auto&& | ||
+ | { | ||
+ | std::cout << (inner_cnt++ ? ",":"" | ||
+ | std::cout << e; | ||
+ | } | ||
+ | std::cout << " | ||
+ | } | ||
+ | std::cout << " | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | using namespace std::views; | ||
+ | | ||
+ | auto v = std:: | ||
+ | auto s = std:: | ||
+ | auto m = std:: | ||
+ | | ||
+ | show( empty< | ||
+ | show( single(42), " | ||
+ | show( iota(0,6), " | ||
+ | show( iota(0) | take(3), " | ||
+ | show( counted(begin(v), | ||
+ | show( v | all, "v | all"); | ||
+ | show( v | reverse, "v | reverse" | ||
+ | show( v | take_while([](int x){ return x < 3; }), "v | take_while(below_3)" | ||
+ | show( v | drop_while([](int x){ return x < 3; }), "v | drop_while(below_3)" | ||
+ | show( v | filter([](int x){ return x%2 != 0; }), "v | filter(odd)" | ||
+ | show( v | transform([](int x){ return x*x; }), "v | transform(square)" | ||
+ | | ||
+ | show( s , " | ||
+ | show_range_of_ranges( s | split(' | ||
+ | show( s | split(' | ||
+ | | ||
+ | show( m | keys , "m | keys" | ||
+ | show( m | values , "m | values" | ||
+ | } | ||
+ | </ | ||
+ | erzeugt die Ausgabe | ||
+ | < | ||
+ | empty< | ||
+ | single(42) | ||
+ | iota(0, | ||
+ | iota(0) | take(3) | ||
+ | counted(begin(v), | ||
+ | v | all : [0, | ||
+ | v | reverse | ||
+ | v | take_while(below_3) | ||
+ | v | drop_while(below_3) | ||
+ | v | filter(odd) | ||
+ | v | transform(square) | ||
+ | s : [A,B, ,C,D, ,E] | ||
+ | s | split(' | ||
+ | s | split(' | ||
+ | m | keys : [answer, | ||
+ | m | values | ||
+ | </ |
kennen/include/ranges.txt · Zuletzt geändert: 2024-02-22 21:04 von rrichter