Modernes C++ programmieren

Okt 23, 2024

lst-0833-book.cpp

// https://godbolt.org/z/qW4hvE9s3 
#include <algorithm>
#include <iostream>
#include <list>
#include <string>
#include <iterator> // ostream_iterator
#include <cctype>   // toupper
using std::toupper;
int main() {
    std::list a{ 1,2,4,4,4,7,7,9 };
    std::list b{ 2,2,3,4,4,8 };
    using Os = std::ostream_iterator<int>; // Typ des Ausgabeiterators
    Os os{std::cout, " "};                 // Streamausgabeiterator für int
    auto run = [&a,&b,&os](auto algo) {    // nutze a, b und os
        algo(a.begin(), a.end(), b.begin(), b.end(), os); // Algorithmus aufrufen
        std::cout << '\n';
    };

    // Ergebnisse der Algorithmen
    using It = decltype(a.begin());       // Typ der Eingabeiteratoren

    run(std::merge<It,It,Os>);            // Ausgabe: 1 2 2 2 3 4 4 4 4 4 7 7 8 9
    run(std::set_union<It,It,Os>);        // Ausgabe: 1 2 2 3 4 4 4 7 7 8 9
    run(std::set_intersection<It,It,Os>); // Ausgabe: 2 4 4
    run(std::set_difference<It,It,Os>);   // Ausgabe: 1 4 7 7 9
    run(std::set_symmetric_difference<It,It,Os>); // Ausgabe: 1 2 3 4 7 7 8 9

    // Mit Buchstaben wird es noch klarer
    std::string x = "abdddggi";
    std::string y = "BBCDDH";
    using Us = std::ostream_iterator<char>;   // Typ des Ausgabeiterators
    Us us{std::cout, ""};                     // Streamausgabeiterator für char
    auto compare = [](auto c, auto d) { return toupper(c) < toupper(d); };
    auto run2 = [&x,&y,&us,&compare](auto algo) {    // nutze x, y und us
        algo(x.begin(), x.end(), y.begin(), y.end(), us, compare);
        std::cout << '\n';
    };
    // Ergebnisse der Algorithmen
    using Jt = decltype(x.begin());           // Typ der Eingabeiteratoren
    using Cm = decltype(compare);             // Typ der Vergleichsfunktion

    run2(std::merge<Jt,Jt,Us,Cm>);            // Ausgabe: abBBCdddDDggHi
    run2(std::set_union<Jt,Jt,Us,Cm>);        // Ausgabe: abBCdddggHi
    run2(std::set_intersection<Jt,Jt,Us,Cm>); // Ausgabe: bdd
    run2(std::set_difference<Jt,Jt,Us,Cm>);   // Ausgabe: adggi
    run2(std::set_symmetric_difference<Jt,Jt,Us,Cm>); // Ausgabe: aBCdggHi
}