#include <print>
#include <vector>
#include <string>
#include <algorithm>

// Herstellerdaten
struct Hersteller
{
    std::string name;
    std::string land;
};
// Vektor mit Autohersteller
std::vector<Hersteller> hvect{
    { "VW","Deutschland" },
    { "Hyundai","Suedkorea" },
    {"Nissan","Japan"},
    {"BMW","Deutschland"},
    {"General Motors","USA"},
    {"Porsche","Deutschland"}
};

int main()
{
    // Lambda-Funktion zur Ausgabe eines Herstellers
    auto Print = [](const Hersteller& data)
    {
        std::println("Hersteller: {}, Land: {}", data.name, data.land);
    };
    // Autohersteller ausgeben
    std::ranges::for_each(hvect, Print);

    // Aller Autohersteller aus Deutschland an
    // den Anfang des Vektors verschieben
    auto hersteller_dt = [](std::string_view land)
                        { return land == "Deutschland"; };
    auto res = std::ranges::stable_partition(hvect, hersteller_dt, &Hersteller::land);

    // Deutsche Autohersteller ausgeben
    std::println("\nDeutsche Autohersteller:");
    std::ranges::for_each(hvect.begin(), res.begin(), Print);
    // Nicht-deutsche Autohersteller ausgeben
    std::println("\nNicht-deutsche Autohersteller:");
    std::ranges::for_each(res.begin(), res.end(), Print);
}