Modernes C++ programmieren

Okt 23, 2024

lst-0821-book.cpp

// https://godbolt.org/z/hYTv6f9eo 
#include <ranges>
#include <array>
#include <string>
#include <iostream>
#include <string_view>
using namespace std::literals; using namespace std;

// Funktion für die Ausgabe von allem Möglichen
template <typename OBJ>
void print(OBJ&& obj, int level = 0) {
  if constexpr(std::ranges::input_range<OBJ>) {                 // range
    cout << '[';
    for (const auto& elem : obj) print(elem, level+1);
    cout << ']';
  } else if constexpr(requires (OBJ tpl){ std::get<0>(tpl);}) { // tuple/pair
    cout << "(";
    print(get<0>(obj), level+1); print(get<1>(obj), level+1);
    cout << ")";
  } else cout << obj;                                           // element
  if (level == 0) cout << '\n';
}
int main() {
  using namespace std::views; // ausnahmsweise für die Kürze
  auto const nums = array{0, 0, 1, 1, 2, 2};
  auto const animals = array{"cat"s, "dog"s};
  print(iota(0, 5) | chunk(2));                      // Ausgabe: [[01][23][4]]
  print(nums | chunk_by(equal_to{}));                // Ausgabe: [[00][11][22]]
  print(iota(0, 5) | slide(3));                      // Ausgabe: [[012][123][234]]
  print(iota(0, 10) | stride(3));                    // Ausgabe: [0369]
  print(repeat(8) |take(5));                         // Ausgabe: [88888]
  print(zip_transform(plus{}, nums, nums));          // Ausgabe: [002244]
  print(zip(iota(0, 3), iota(1, 4)));                // Ausgabe: [(01)(12)(23)]
  print(iota(0, 4) | adjacent<2>);                   // Ausgabe: [(01)(12)(23)]
  print(iota(0, 4) | pairwise);                      // Ausgabe: [(01)(12)(23)]
  print(iota(0, 4) | adjacent_transform<2>(plus{})); // Ausgabe: [135]
  print(iota(0, 4) | pairwise_transform(plus{}));    // Ausgabe: [135]
  print(animals | join_with( '+' ));                 // Ausgabe: [cat+dog]
  print(cartesian_product(iota(0, 2), "AZ"s));       // Ausgabe: [(0A)(0Z)(1A)(1Z)]
  print(enumerate("APL"s));                          // Ausgabe: [(0A)(1P)(2L)]
  return 0;
}