Programmierkurs C++ Templates & STL (1/2)

Ähnliche Dokumente
Einführung in die STL anhand eines ausgewählten Beispiels

Objektorientierte Programmierung mit C++ Vector und List

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

1. Übung zu "Numerik partieller Differentialgleichungen"

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Einführung in C++ mit Microsoft VS

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Objektorientierte Programmierung mit C++ SS 2007

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

Programmierkurs. SoSe Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

Programmieren in C++ Arrays, Strings und Zeigerarithmetik

Ulla Kirch Peter Prinz C+ + Lernen und professionell anwenden. mitp

Meeting C++ C++11 R-Value Referenzen

Programmierung in C/C++

Java Einführung Collections

Eine Einführung in C-Funktionen

Vorkurs C++ Programmierung

Deklarationen in C. Prof. Dr. Margarita Esponda

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Algorithmen und Datenstrukturen

Modellierung und Programmierung 1

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Programmierkurs Java

Angewandte Mathematik und Programmierung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Whitebox-Vererbung vs. Blackbox-Vererbung. - Begriffsbestimmung - Vererbung öffentliche Vererbung private Vererbung - Zusammenfassung

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch

Kapitel 11: Wiederholung und Zusammenfassung

J.5 Die Java Virtual Machine

Widmung Einleitung Vorwort 15 Übersicht zu diesem Buch Einführung in die Welt der Objektorientierung... 21

Javakurs für Anfänger

C++-Entwicklung mit Linux

Objektorientiertes Programmieren für Ingenieure

Einführung in die Programmierung Arrays, Zeiger, Strings. Arvid Terzibaschian

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

C# im Vergleich zu Java

Tutorium Rechnerorganisation

5.4 Klassen und Objekte

AlDaBi Prak+kum WS 14/15 René Rahn

1 Polymorphie (Vielgestaltigkeit)

Einführung in die Programmierung Konstanten, dynamische Datenstrukturen. Arvid Terzibaschian

3 Objektorientierte Konzepte in Java

Javakurs 2013 Objektorientierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Probeklausur: Programmierung WS04/05

1. Von der Idee zur Software 2. Funktionen und Datenstrukturen Lehrbuch: Organisation des Quellcodes 4. Werte- und Referenzsemantik

10. Klassen. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Vererbung & Schnittstellen in C#

Dr. Monika Meiler. Inhalt

Modellierung und Programmierung

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Type Erasure in Java 5. Helmi Jouini Institut für Theoretische Informatik Universität Karlsruhe

C++ - Funktionen und mehr. Kerstin Gößner und Ralf Wondratschek

Objective-C CheatSheet

Name: Klausur Programmierkonzepte SS 2011

Schnittstellen implementieren am Beispiel Suchbaum

Kapitel 6. Vererbung

Einführung in die C++ Programmierung für Ingenieure

Versuchsziele Kenntnisse in der Anwendung von: Sortieren mit Klassen Benutzung von generischen Klassen o Definition o Sortierung.

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

Es gibt zwei verschiedene Arten, wie Programme auf dem Rechner ausgeführt werden:

Kapitel 6. Vererbung

C++ Programmierung. Uwe Naumann. LuFG Informatik 12, RWTH Aachen University, Germany

Institut für Informatik

Programmieren - Vererbung & Polymorphie

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

Java Einführung Methoden in Klassen

Die Programmiersprache C

Java Schulung. Objektorientierte Programmierung in Java Teil V: Die Java Collection Klassen. Prof. Dr. Nikolaus Wulff

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Grundlagen von Python

AlDaBi Praktikum WS 15/16 Hannes Hauswedell, Johannes Röhr, Jongkyu Kim

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Schnelles Prototyping (Rapid Application Development, RAD)

Aufgabe 1. »Programmieren«, WS 2006/2007. Nino Simunic M.A.

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Übersicht. Einführung in die Programmierung. main. main. main. main. Speicherverwaltung. Definition nach ANSI C:

Einführung in die C-Programmierung

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Objektorientierte Programmierung

Einführung in das Objektorientierte Programmieren mit C++

Kapitel 6. Vererbung

C++, STL und Qt. C++, STL und Qt. Dipl.Ing. Christoph Stockmayer, Schwaig,

Strukturierte Datentypen und Funktionszeiger

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

Abschnitt 9: Schnittstellen: Interfaces

Modul 122 VBA Scribt.docx

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Moderne C-Programmierung

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

Praktikum Betriebssysteme 1. Aufgabe (1)

Transkript:

Programmierkurs C++ Templates & STL (1/2) Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/fischer

#2 Templates Die wichtigsten objekt-orientierten Abstraktionen in C++ Daten-Abstraktion (Klassen) Beziehungen zwischen Klassen (Vererbung) Polymorphismus Fördern die (Wieder-)Verwendung von vorhandenen (kompilierten) Implementierungen Verwendung der selben Datentypen für alle Anwendungen Beispiel class Stack { Stack(int max_size = 10); ~Stack(); bool push(const int& value); bool pop(); int& top(); private: unsigned int size_; unsigned int elements_; int* stack_[]; };

#3 Templates Eine Möglichkeit der Wiederverwendung dieses Quellcodes für andere Objekte (z.b. vom Typ Car ) basiert auf Copy&Paste Kopiere den existieren Stack Umbenennung in CarStack Ersetzen aller Vorkommen von int mit Car Fehleranfällig und Arbeitsintensiv Beispiel class CarStack { CarStack(int max_size = 10); ~CarStack(); bool push(const Car& value); bool pop(); Car& top(); private: unsigned int size_; unsigned int elements_; Car* stack_[]; };

#4 Templates Erkenntnis: Viele Datenstrukturen (z.b. ein Stack) können implementiert werden, ohne zu wissen, welchen Datentyp sie beinhalten sollen T steht in diesem Fall für einen beliebigen Datentyp Beispiel class Stack { Stack(int max_size = 10); ~Stack(); bool push(const T& value); bool pop(); T& top(); private: unsigned int size_; unsigned int elements_; T* stack_[]; };

#5 Templates C++ bietet einen Mechanismus, um genau das umzusetzen Durch Templates kann der selbe Quellcode für unterschiedliche Datentypen verwendet werden Wird vom Compiler automatisch umgesetzt Schlüsselwort: typename (es kann auch class verwendet werden) Beispiel template<typename T> class Stack { Stack(int max_size = 10); ~Stack(); bool push(const T& value); bool pop(); T& top(); private: unsigned int size_; unsigned int elements_; (T*) stack_[]; };

#6 Templates Templates erlauben die Parametrisierung von Klassen und Funktionen zur Übersetzungszeit Ein Template definiert eine Familie von Klassen oder Funktionen Der Ausdruck Stack<int> erzeugt einen neuen Datentyp, bei welchem ein int statt des T steht Dieser Prozess wird als Instanziierung eines Template bezeichnet Beispiele für Parameter eines Templates Typen (standardisierte oder benutzer-definierte) Konstanten, die zur Übersetzungszeit bekannt sind (z.b. Integer, Pointer und Referenzen auf Statische Entities) Andere Templates

Template Funktionen Beispiel template<typename T> void swap(t& x, T& y) { T temp = x; x = y; y = temp; } Verwendung int i1 = 5; int i2 = 7; Implizit: swap(i1, i2); // Compiler erkennt Typen automatisch Explizit: swap<int>(i1, i2);// Manuelle/Explizite angebe des Typs #7

Template Klassen: Deklaration Definition (verwendet class oder typename) Verwendung K<int, double> k; template<typename X, typename Y> class K { X x;... }; template<class X, class Y> class K { X x;... }; #8

Template Klassen: Definition Methoden werden inline implementiert Wie bei jeder anderen inline Implementierung einer Methode Typ Y wird in diesem Beispiel nicht verwendet Beispiel template<typename X, typename Y> class K { X x; X& getx() { return x; } }; #9

#10 Template Klassen: Definition Trennung von Deklaration und Definition Implementierung muss im Header File erfolgen Nennung des Template als Präfix vor jeder Methode Beispiel template<typename X, typename Y> class K { X x; X& getx(); }; template<typename X, typename Y> X& K<X,Y>::getX() { return x; }

#11 Templates: Standard Parameter Genau wie Funktionen können auch Templates über (Standard-) Parameter verfügen Dieser werden zur Übersetzungszeit wie Konstanten behandelt Beispiel template<typename T, unsigned int size_ = 10> class Stack { T(/* Kein size parameter mehr!*/); ~T(); bool push(const T& value); bool pop(); T& top(); private: /* Kein size parameter mehr */ unsigned int elements_; T* stack_[size]; // Ermöglicht statische Speicheranforderung };

Datenstrukturen In vielen Sprachen hat praktisch jedes Programm seine eigenen Datentypen implementiert Probleme: viel unnötiger Code, Fehlerquelle, schwer auszutauschen, jedes Programm war einzigartig hohe Einarbeitungszeit Daher: Standardbibliothek, welche alle Standardtypen bereitstellt STL = Standard Template Library Basiert auf jahrzehntelanger Erfahrung im Design und der Implementierung von wiederverwendbaren Bibliotheken Referenzen http://www.sgi.com/tech/stl/ http://en.cppreference.com/w/cpp/container #12

#13 C++ STL C++ bietet eine sehr umfangreiche, zuverlässige und effiziente Standard-Bibliothek Beinhaltet die Standard-Bibliothek von C (und löst diese ab) Realisiert mittels Template Klassen und Funktionen Die STL basiert auf jahrzehntelanger Erfahrung im Design und der Implementierung von Wiederverwendbaren Bibliotheken Ziele der STL (genau wie die von C++) Einfachheit Effizienz Flexibilität Allgemeingültigkeit Bevor etwas selbst implementiert wird, zuerst in die STL schauen!

#14 C++ STL Die STL umfasst String (Zeichenketten) iostreams (Ein- und Ausgabedatenströme) Kontainer Kontainer sind Objekte, welche andere Objekte (Elemente) speichern und Methoden anbieten, um auf die Elemente mittels Iteratoren zuzugreifen Sequentielle und assoziative Kontainer Iterator Generalisierung von Pointern Algorithmen verwenden Iteratoren um auf Kontainer zuzugreifen Algorithmen Allgemeingültige Algorithmen, zur typ-sicheren Verarbeitung von Sequenzen beliebigen Typs verwendet werden können Beispiele: reverse, sort,

#15 C++ STL: Kontainer Warum mehrere Kontainer? Unterschiedliche Kontainer bieten ähnliche Dienste an Sie unterscheiden sich jedoch im Verhalten und in der Schnittstelle Die Zeit- und Platzkomplexität unterscheidet sich über die verschiedene Operationen Beispiele Ein Stack hat eine andere Schnittstelle als ein Vector Das Einfügen von Elementen am Ende eines Vectors ist sehr schnell Das Einfügen von Elementen in der Mitte eines Vectors ist sehr langsam Das Einfügen von Elementen in eine Verkettete Liste ist immer sehr schnell, egal an welcher Position

C++ STL: Kontainer und Iteratoren Kontainer haben (wo möglich) eine sehr ähnliche Schnittstelle Eine Iterator-Klasse, z.b. vector<int>::iterator Methoden zum Elementzugriff, z.b. front(), insert( ), resize( ), begin(), end(), Kontainer unterstützen geschachtelte Iteratoren an, um auf die Unterelemente zuzugreifen z.b., vector<int>::iterator, set<car>::iterator Zugriff auf Elemente in einem Kontainer erfolgt typischerweise über Iteratoren vector<int> v; vector<int>::iterator it = v.begin(); Zeigt auf das erste Element vector<int>::iterator sec = it+2; Drittes Element vector<int>::iterator e = v.end(); Zeigt hinter das letzte Element vector<int>::iterator l = v.end() -1; Zeigt auf das letzte Element (falls vorhanden) begin() begin()+2 end()-1 end() 1 3 55 2 7 8 4 1 #16

C++ STL: Vector Der einfachste Kontainer in der STL und häufig der effizienteste Vector ist ein sequentieller Kontainer Bietet wahlfreien Zugriff auf alle Elemente Einfügen und Löschen am Ende benötigt konstante Zeit Einfügen und Löschen an jeder anderen Position benötigt lineare Zeit Dynamische Länge, benötigter Speicher wird vom Vector selbständig verwaltet Wichtige Methoden push_back(t& t), pop_back() Einfügen/Löschen am Ende begin(), end() Iteratoren front(), back() Referenzen auf bestimmte Elemente size(), empty(), max_size() Anzahl der Elemente und maximale Anzahl Elemente operator[](size_type n) Zugriff wie bei einem Array, z.b. v[3] insert(iterator pos, const T& x) Füge x an Position pos ein iterator erase(iterator pos) Löscht das Element an der Position pos #17

C++ STL: Verwendung eines <vector> #18

Überlauf des aktuell reservierten Speichers Was passiert, wenn mehr Elemente in dem Vector abgelegt werden sollen, als seine Kapazität erlaubt? Der Vector passt seine Kapazität an, indem er 1) Einen neuen, größeren Speicherbereich reserviert (typischerweise doppelt so groß wie der vorherige) 2) Alle Elemente vom alten Speicherbereich in den neuen Speicherbereich kopiert (mittels des Kopierkonstruktors der Elemente) 3) Die alten Objekte löscht (Destruktor jedes Elements wird aufgerufen) 4) Den alten Speicherbereich wieder freigibt Dieser Prozess verursacht Overhead zur Laufzeit Wenn die Anzahl der Elemente bekannt ist, die in einem Vector gespeichert werden soll, kann die Effizient mittels reserve(size_type n) gesteigert werden Dies verhindert die kostspielige Anpassung der Kapazität, indem gleich die passende Menge Speicher für den Vector reserviert wird #19

#20 Verwendung von Iteratoren Vorsicht: Iterator muss genau einmal erhöht werden!

#21 Verwendung von Iteratoren Oft besser: Referenz auf nächstes Objekt einer Variable zuweisen

Kürzere Variante: for-schleife Iterationen über Container lassen sich mit der for-schleife prägnant und kurz schreiben Initialisierung: Zuweisung einer Iterator-Referenz Bedingung: Prüfen auf Iterator!= end() Inkrement #22

#23 Noch kürzere Variante: for_each-schleife Abkürzende Schreibweise der STL aus <algorithm> Für jedes Element, welches mittels des Iterators erreicht wird, wird eine Funktion aufgerufen

#24 For_each Umwandlung Beispiel: Umwandlung einer for-schleife in eine for_each-schleife