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-22 20:54] – [Beispiele] rrichter | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== < | ||
+ | Bereiche sind Elementfolgen, | ||
+ | Die Algorithmen der Standardbibliothek erlauben seit [[..: | ||
+ | Allerdings sind die einzelnen Algorithmen jeweils nacheinander auszuführen, | ||
+ | MIt einem anderen Ansatz soll dieser Nachteil behoben werden. | ||
+ | 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 << ' '; | ||
+ | } | ||
+ | </ | ||
+ | ===== Quellen und Senken ===== | ||
+ | Sequentielle und assoziative (!) Container können als Quellbereiche dienen. Mit '' | ||
+ | |||
+ | <code cpp to.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include <set> | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | std::set s{ ' | ||
+ | auto v = s | std:: | ||
+ | for (auto e : v) std::cout << e; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Fabriken ===== | ||
+ | erzeugen Bereiche (° : definiert in [[..: | ||
+ | |||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
+ | <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 oder mehrere Bereiche, verarbeiten dessen / deren Elemente '' | ||
+ | |||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
+ | |||
+ | ===== Beispiele ===== | ||
+ | |||
+ | <code cpp views_examples.cpp> | ||
+ | #include < | ||
+ | #include <map> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // waiting for C++23 support: P2286 Formatting Ranges ... | ||
+ | #if defined(__cpp_lib_format_ranges) && defined(__cpp_lib_print) | ||
+ | #include < | ||
+ | |||
+ | template < | ||
+ | void show(Range&& | ||
+ | { | ||
+ | std:: | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | void show_range_of_ranges(Range&& | ||
+ | { | ||
+ | show(r, message); | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | void show_range_of_pairs(Range&& | ||
+ | { | ||
+ | show(r, message); | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | void show_map(Range&& | ||
+ | { | ||
+ | show(r, message); | ||
+ | } | ||
+ | |||
+ | #else | ||
+ | #include < | ||
+ | |||
+ | auto decorate(auto e) | ||
+ | { | ||
+ | return e; | ||
+ | } | ||
+ | |||
+ | auto decorate(char e) | ||
+ | { | ||
+ | return std:: | ||
+ | } | ||
+ | |||
+ | auto decorate(std:: | ||
+ | { | ||
+ | return std:: | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | void show(Range&& | ||
+ | { | ||
+ | std:: | ||
+ | std::cout << std::left << message << | ||
+ | int cnt = 0; | ||
+ | for (auto&& | ||
+ | { | ||
+ | std::cout << (cnt++ ? ", ":"" | ||
+ | } | ||
+ | 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++ ? ", ":"" | ||
+ | << decorate(e); | ||
+ | } | ||
+ | std::cout << " | ||
+ | } | ||
+ | std::cout << " | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | void show_range_of_pairs(Range&& | ||
+ | { | ||
+ | std:: | ||
+ | std::cout << std::left << message << | ||
+ | int cnt = 0; | ||
+ | for (auto&& | ||
+ | { | ||
+ | std::cout << (cnt++ ? ", ":"" | ||
+ | << " | ||
+ | } | ||
+ | std::cout << " | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | void show_map(Range&& | ||
+ | { | ||
+ | std:: | ||
+ | std::cout << std::left << message << | ||
+ | int cnt = 0; | ||
+ | for (auto&& | ||
+ | { | ||
+ | std::cout << (cnt++ ? ", ":"" | ||
+ | << decorate(k) << ": " << decorate(v); | ||
+ | } | ||
+ | std::cout << " | ||
+ | } | ||
+ | |||
+ | #endif // defined(__cpp_lib_format_ranges) && defined(__cpp_lib_print) | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | using namespace std::views; | ||
+ | using namespace std:: | ||
+ | | ||
+ | auto v = std:: | ||
+ | auto s = "AB CDE"s; | ||
+ | auto m = std:: | ||
+ | auto below_5 = [](int x){ return x < 5; }; | ||
+ | auto double_digit = [](int a, int b) { return 10*a + b; }; | ||
+ | | ||
+ | show( empty< | ||
+ | show( single(42), " | ||
+ | show( iota(0,6), " | ||
+ | show( iota(0) | take(3), " | ||
+ | show( repeat(6) | take(3), " | ||
+ | std::cout << ' | ||
+ | |||
+ | show( counted(begin(v), | ||
+ | show( v | all, "v | all"); | ||
+ | show( v | drop_while(below_5), | ||
+ | show_range_of_pairs(v | enumerate, "v | enumerate" | ||
+ | show( v | filter(below_5), | ||
+ | show( v | reverse, "v | reverse" | ||
+ | show( v | take_while(below_5), | ||
+ | show( v | transform([](int x){ return x*x; }), "v | transform(square)" | ||
+ | std::cout << ' | ||
+ | |||
+ | show_range_of_ranges( v | chunk(3), "v | chunk(3)" | ||
+ | show_range_of_ranges( v | chunk_by(std:: | ||
+ | show( v | pairwise_transform(double_digit), | ||
+ | show_range_of_pairs( v | pairwise, "v | pairwise" | ||
+ | show_range_of_ranges( v | slide(2), "v | slide(2)" | ||
+ | show( v | stride(2), "v | stride(2)" | ||
+ | std::cout << ' | ||
+ | |||
+ | show( s , " | ||
+ | show_range_of_ranges( s | split(' | ||
+ | show( s | split(' | ||
+ | show( s | split(' | ||
+ | std::cout << ' | ||
+ | |||
+ | show_range_of_pairs( zip(v, s), " | ||
+ | show( zip_transform(double_digit, | ||
+ | show_range_of_pairs( cartesian_product(v|take(2), | ||
+ | std::cout << ' | ||
+ | |||
+ | show_map( m , " | ||
+ | show( m | keys , "m | keys" | ||
+ | show( m | values , "m | values" | ||
+ | } | ||
+ | </ | ||
+ | erzeugt die Ausgabe | ||
+ | < | ||
+ | empty< | ||
+ | single(42) | ||
+ | iota(0, | ||
+ | iota(0) | take(3) | ||
+ | repeat(6) | take(3) | ||
+ | |||
+ | counted(begin(v), | ||
+ | v | all : [1, 3, 5, 4, 2] | ||
+ | v | drop_while(below_5) | ||
+ | v | enumerate | ||
+ | v | filter(below_5) | ||
+ | v | reverse | ||
+ | v | take_while(below_5) | ||
+ | v | transform(square) | ||
+ | |||
+ | v | chunk(3) | ||
+ | v | chunk_by(std:: | ||
+ | v | pairwise_transform(double_digit) | ||
+ | v | pairwise | ||
+ | v | slide(2) | ||
+ | v | stride(2) | ||
+ | |||
+ | s : [' | ||
+ | s | split(' | ||
+ | s | split(' | ||
+ | s | split(' | ||
+ | |||
+ | zip(v, s) : [(1, ' | ||
+ | zip_transform(double_digit, | ||
+ | cartesian_product(v|take(2), | ||
+ | |||
+ | m : {" | ||
+ | m | keys : [" | ||
+ | m | values | ||
+ | </ |
kennen/include/ranges.txt · Zuletzt geändert: 2024-02-22 21:04 von rrichter