From a7672bbe11749383e34fdfc1c5fc2916014a02ca Mon Sep 17 00:00:00 2001 From: b0rbor4d Date: Wed, 15 Apr 2026 00:18:27 +0200 Subject: [PATCH] Add C++ example: module5_datastructures_cpp.cpp --- .../module5_datastructures_cpp.cpp | 219 ++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 src/cpp_examples/module5_datastructures_cpp.cpp diff --git a/src/cpp_examples/module5_datastructures_cpp.cpp b/src/cpp_examples/module5_datastructures_cpp.cpp new file mode 100644 index 0000000..a80cbbe --- /dev/null +++ b/src/cpp_examples/module5_datastructures_cpp.cpp @@ -0,0 +1,219 @@ +// ============================================ +// C++ Vergleich: Modul 5 - Datenstrukturen +// STL (Standard Template Library) +// ============================================ + +#include +#include +#include +#include +#include +#include +#include +#include + +// C++: vector (dynamisches Array) +void demo_vector() { + std::cout << "=== C++: vector (wie C-Vector, aber besser) ===\n\n"; + + // Erstellen + std::vector vec = {10, 20, 30}; + + // Hinzufügen + vec.push_back(40); // Automatisch wachsen! + + // Zugriff + std::cout << "vec[0]: " << vec[0] << "\n"; + std::cout << "vec.at(1): " << vec.at(1) << "\n"; // Mit Bounds-Check + + // Größe + std::cout << "Size: " << vec.size() << "\n"; + std::cout << "Capacity: " << vec.capacity() << "\n"; + + // Iterieren + std::cout << "Alle Elemente: "; + for (int x : vec) { + std::cout << x << " "; + } + std::cout << "\n\n"; + + // Kein manuelles free nötig! +} + +// C++: list (doppelt verkettete Liste) +void demo_list() { + std::cout << "=== C++: list (Linked List) ===\n\n"; + + std::list lst = {30, 20, 10}; + + // Einfügen + lst.push_front(5); // Am Anfang + lst.push_back(40); // Am Ende + + // Entfernen + lst.remove(20); // Alle 20 entfernen + + // Iterieren + std::cout << "Alle Elemente: "; + for (int x : lst) { + std::cout << x << " "; + } + std::cout << "\n\n"; +} + +// C++: stack (LIFO) +void demo_stack() { + std::cout << "=== C++: stack (LIFO) ===\n\n"; + + std::stack st; + + // Push + st.push(10); + st.push(20); + st.push(30); + + std::cout << "Top: " << st.top() << "\n"; + + // Pop + st.pop(); + std::cout << "Nach pop, top: " << st.top() << "\n"; + + std::cout << "Size: " << st.size() << "\n\n"; +} + +// C++: queue (FIFO) +void demo_queue() { + std::cout << "=== C++: queue (FIFO) ===\n\n"; + + std::queue q; + + // Enqueue + q.push("Erster"); + q.push("Zweiter"); + q.push("Dritter"); + + std::cout << "Front: " << q.front() << "\n"; + std::cout << "Back: " << q.back() << "\n"; + + // Dequeue + q.pop(); + std::cout << "Nach dequeue, front: " << q.front() << "\n\n"; +} + +// C++: map (Hash Map / Dictionary) +void demo_map() { + std::cout << "=== C++: map (Hash Map) ===\n\n"; + + std::map scores; + + // Einfügen + scores["Alice"] = 95; + scores["Bob"] = 87; + scores["Charlie"] = 92; + + // Zugriff + std::cout << "Alice: " << scores["Alice"] << "\n"; + + // Prüfen ob vorhanden + if (scores.find("David") == scores.end()) { + std::cout << "David nicht gefunden\n"; + } + + // Iterieren + std::cout << "\nAlle Scores:\n"; + for (const auto& pair : scores) { + std::cout << pair.first << ": " << pair.second << "\n"; + } + + std::cout << "\n"; +} + +// C++: Algorithmen +void demo_algorithms() { + std::cout << "=== C++: Algorithmen (STL) ===\n\n"; + + std::vector vec = {3, 1, 4, 1, 5, 9, 2, 6}; + + // Sortieren + std::sort(vec.begin(), vec.end()); + std::cout << "Sortiert: "; + for (int x : vec) std::cout << x << " "; + std::cout << "\n"; + + // Binary Search + bool found = std::binary_search(vec.begin(), vec.end(), 5); + std::cout << "5 gefunden: " << (found ? "ja" : "nein") << "\n"; + + // Find + auto it = std::find(vec.begin(), vec.end(), 4); + if (it != vec.end()) { + std::cout << "4 gefunden an Position: " << std::distance(vec.begin(), it) << "\n"; + } + + // Min/Max + auto [minIt, maxIt] = std::minmax_element(vec.begin(), vec.end()); + std::cout << "Min: " << *minIt << ", Max: " << *maxIt << "\n"; + + // Count + int count = std::count(vec.begin(), vec.end(), 1); + std::cout << "Anzahl 1er: " << count << "\n"; + + // Transform (map) + std::vector doubled; + std::transform(vec.begin(), vec.end(), std::back_inserter(doubled), + [](int x) { return x * 2; }); + + std::cout << "Verdoppelt: "; + for (int x : doubled) std::cout << x << " "; + std::cout << "\n\n"; +} + +// C++: pair und tuple +void demo_pair_tuple() { + std::cout << "=== C++: pair und tuple ===\n\n"; + + // pair: Zwei Werte + std::pair student = {"Alice", 95}; + std::cout << "Student: " << student.first << " = " << student.second << "\n"; + + // Auto + structured binding (C++17) + auto [name, score] = student; + std::cout << "Destructured: " << name << " = " << score << "\n"; + + // tuple: Mehrere Werte + std::tuple record = {"Project", 42, 3.14}; + std::cout << "Tuple: " << std::get<0>(record) << ", " + << std::get<1>(record) << ", " + << std::get<2>(record) << "\n\n"; +} + +// ============================================ +// Hauptprogramm +// ============================================ +int main() { + std::cout << "=== C++ STL: Datenstrukturen ===\n\n"; + + demo_vector(); + demo_list(); + demo_stack(); + demo_queue(); + demo_map(); + demo_algorithms(); + demo_pair_tuple(); + + std::cout << "=== Vergleich: C vs C++ ===\n\n"; + std::cout << "C:\n"; + std::cout << " - Manuelle Implementierung (LinkedList, Stack, Queue)\n"; + std::cout << " - malloc/free für jedes Element\n"; + std::cout << " - Keine built-in Algorithmen\n"; + std::cout << " - Keine Generics (void* casts)\n\n"; + + std::cout << "C++ STL:\n"; + std::cout << " - Fertige, optimierte Container\n"; + std::cout << " - Automatische Speicherverwaltung\n"; + std::cout << " - 100+ Algorithmen (sort, find, binary_search...)\n"; + std::cout << " - Templates (typsichere Generics)\n"; + std::cout << " - Iteratoren für einheitliche Schnittstelle\n"; + + return 0; +}