Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Relevanta dokument
Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

2D1387, Programsystemkonstruktion med C++ 01/02 1

Tommy Färnqvist, IDA, Linköpings universitet

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Generiska konstruktioner. Kursbokens kapitel 13

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Föreläsning Datastrukturer (DAT036)

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen *:85/2I4123 C

Tillämpad programmering

7 Templates och Exceptions

Tillämpad programmering

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Föreläsning 9 Datastrukturer (DAT037)

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Algoritmbiblioteket (STL) Designstrategi Generiska algoritmer som fungerar på godtyckliga samlingsdatatyper, vilka har iteratorer.

Föreläsning 9 Innehåll

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

DAI2 (TIDAL) + I2 (TKIEK)

Högskolan Dalarna sid 1 av 5 Data-avdelningen Hans-Edy Mårtensson

Föreläsning 4 Innehåll

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Tentamen i Algoritmer & Datastrukturer i Java

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

TDIU01 Programmering i C++

Föreläsning 3. Stack

Föreläsning 3. Stack

Intro till standardbiblioteket. Eric Elfving

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Föreläsning 4 Datastrukturer (DAT037)

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Tentamen EDAF30 Programmering i C++

Algoritmer och datastrukturer 2012, föreläsning 6

Programmering i C++ EDA623 Containerklasser och algoritmbibliotek. EDA623 (Föreläsning 10) HT / 33

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Innehåll. Klasserna vector och deque

Introduktion till algoritmer - Lektion 3 Matematikgymnasiet, Läsåret Lektion 3

TDDC76 - Programmering och Datastrukturer

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TDDC76 - Programmering och Datastrukturer

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Collections Collections "Envisa" objekt Klasserna Bofstream och Bifstream Definition av metoder i klasserna Bifstream och Bofstream Klassen Streng

Kapitel 4 - Mallar. Kapitel 4. Introduktion till mallar STL. 2D1387 Programsystemkonstruktion med C++ 1

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Generell (template) programmering. Effektiv C++ Slutliga tips Genomgång av gammal tenta. Daniel Aarno Allt som fungerar som x ÄR x

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

13 Prioritetsköer, heapar

Tentamen EDAF30 Programmering i C++

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

TDDC76 - Programmering och Datastrukturer

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Innehåll. Pekare Exempel

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Länkade strukturer. (del 2)

Innehåll. Pekare Exempel

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

TDIU01 - Programmering i C++, grundkurs

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

Tentamen EDAF30 Programmering i C++

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

Föreläsning 7. Träd och binära sökträd

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Föreläsning 13. Träd

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Programmering A. Johan Eliasson

Länkade strukturer, parametriserade typer och undantag

Föreläsning 3 Datastrukturer (DAT037)

Kurskod D0010E Datum Skrivtid 5tim

TDIU01 - Programmering i C++, grundkurs

Symboliska konstanter const

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Programsystemkonstruktion med C++

Tentamen i Algoritmer & Datastrukturer i Java

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Föreläsning 2 Datastrukturer (DAT037)

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Transkript:

Programmering i C++ EDA623 Mallar EDA623 (Föreläsning 12) HT 2013 1 / 29

Mallar Innehåll Klassmallar Funktionsmallar EDA623 (Föreläsning 12) HT 2013 2 / 29

Containerklasserna vector, deque och list utgör exempel på klasser med typparametrisering eller klassmallar Kompilatorn genererar utgående från en sådan klassmall alla olika typer av klasser som behövs beroende på aktuell typ insatt som typparameter Slipper manuellt skriva en ny klass för varje enskild komponentdatatyp för att implementera en viss sammansatt datastruktur EDA623 (Föreläsning 12) HT 2013 3 / 29

Exempel: Egen generisk stackklass template <class T> class Stack { T *v, *p; int sz; public: Stack(int s) {v = p = new T[sz=s]; ~Stack() {delete [] v; void push(t a) {*p++ = a; T pop() {return *--p; int size() const {return p-v; ; p v T utgör här en s.k. typparameter EDA623 (Föreläsning 12) HT 2013 4 / 29

En stack för upp till 100 st char kan skapas så här: Stack <char> sc(100); vilket ger samma resultat som class Stack_char { char *v, *p; int sz; public: Stack_char(int s) {v = p = new char[sz=s]; ~Stack_char() {delete [] v; void push(char a) {*p++ = a; char pop() {return *--p; int size() const {return p-v; ; //... Stack_char sc(100); EDA623 (Föreläsning 12) HT 2013 5 / 29

Annan variant av klassmall (utan inline) template <class T> class Stack { public: Stack(int s); ~Stack(); void push(t a); T pop(); int size() const; private: T *v, *p; int sz; ; EDA623 (Föreläsning 12) HT 2013 6 / 29

Annan variant av klassmall (utan inline) // Medlemsfunktioner def. i.h-filen utanför klassen template<class T> void Stack<T>::push(T a) { *p++ = a; template<class T> T Stack<T>::pop() { return *--p; template<class T> Stack<T>::Stack(int s) { v = p = new T[sz = s]; template<class T> Stack<T>::~Stack() { delete []v; EDA623 (Föreläsning 12) HT 2013 7 / 29

Exempel på användning av Stack Stack<double> sd(200); void f(stack<komplex>& sk) { sk.push(komplex(2.1, 3.44)); Komplex z = 0.45*sk.pop(); sk.push(z); Stack<int> *p = 0; p = new Stack<int>(200); for (int i = 0; i<200; i++) { p->push(i); sd.push(3.14*i); EDA623 (Föreläsning 12) HT 2013 8 / 29

Även s.k. värdeparametrar kan användas template <class T, int siz> class Stack { public: Stack() {v = p = new T[sz=siz]; ~Stack() {delete [] v; void push(t a) {*p++ = a; T pop() {return *--p; int size() const {return p-v; private: T *v, *p; int sz; ; // // p = new Stack<int>(200); // ersätts med // p = new Stack<int, 200>; EDA623 (Föreläsning 12) HT 2013 9 / 29

Statiska medlemmar template <class T> class Stack { //... static int nst = 0; public: //... static int antal_stackar() {return nst; ; Varje typ av stack (Stack<int>, Stack<char> osv) har en egen upplaga av klassvariabeln nst EDA623 (Föreläsning 12) HT 2013 10 / 29

En trädklassmall... template<class D> class Trad { public: Trad() : rot(nullptr) { Trad(D d) { rot = new Nod<D>(d); ~Trad() { delete rot; bool tomt() const { return rot == nullptr; D& varde() const { koll(); return rot->data; Trad& v_barn() const { koll(); return *rot->vanster; Trad& h_barn() const { koll(); return *rot->hoger; void satt_in(d d); D* sok(d d); private: // class Nod {; Nod *rot; void koll() const {if (tomt()) throw range_error("trad"); ; EDA623 (Föreläsning 12) HT 2013 11 / 29

... med den inre nodklassen template<class D> class Trad { public: //... private: class Nod { friend class Trad<D>; D data; Trad<D> vanster, hoger; Nod(D d) : data(d) { ~Nod() { ; //... ; EDA623 (Föreläsning 12) HT 2013 12 / 29

Medlemsfunktioner i trädklassmallen // Insättning i binärt sökträd template<class D> void Trad<D>::satt_in(D d) const { if (tomt()) rot = new Nod<D>(d); else if (d < varde()) v_barn().satt_in(d); else h_barn().satt_in(d); EDA623 (Föreläsning 12) HT 2013 13 / 29

Medlemsfunktioner i trädklassmallen // Sökning i binärt sökträd template<class D> D* Trad<D>::sok(D d) { if (tomt()) return nullptr; else if (d == varde()) return &varde(); else if (d < varde()) return v_barn().sok(d); else return h_barn().sok(d); EDA623 (Föreläsning 12) HT 2013 14 / 29

Skapande av ett träd med heltal //... Trad<int> t; cin >> i; t.satt_in(i); cin >> i; if (t.sok(i)) cout << "finns i trädet" << endl; EDA623 (Föreläsning 12) HT 2013 15 / 29

Skapande av ett träd med personer istället heltal class Person { public: char pnr[11]; char namn[40]; ; //... Trad<Person> t; //... motsvarande operationer som innan // men denna gång fungerar det inte // eftersom jämförelse inte är definierat // för Person-klassen EDA623 (Föreläsning 12) HT 2013 16 / 29

Trick: Använd en s.k. egenskapsklass (traits class) med statiska funktioner mindre och lika vilka ersätter < resp. ==. // Modifiering av klassen Trad med // egenskapsklass E template<class D, class E> class Trad { // Samma som innan ; EDA623 (Föreläsning 12) HT 2013 17 / 29

Modifiering av medlemsfunktionerna template<class D, class E> void Trad<D,E>::satt_in(D d) { if (tomt()) rot = new Nod<D>(d); else if (E::mindre(d, varde())) v_barn().satt_in(d); else h_barn().satt_in(d); EDA623 (Föreläsning 12) HT 2013 18 / 29

Modifiering av medlemsfunktionerna template<class D, class E> D* Trad<D>::sok(D d) { if (tomt()) return 0; else if (E::lika(d, varde())) return &varde(); else if (E::mindre(d, varde())) return v_barn().sok(d); else return h_barn().sok(d); EDA623 (Föreläsning 12) HT 2013 19 / 29

För att det fortfarande ska fungera för de fall där < och == är definierade kan följande användas template<class D> class TradE { public: static bool lika (const D& d1, const D& d2) {return d1 == d2; static bool mindre(const D& d1, const D& d2) {return d1 < d2; // Skapa ett träd Trad<int, TradE<int> > t; EDA623 (Föreläsning 12) HT 2013 20 / 29

För att det ska fungera för t.ex. klassen Person måste en specialinstans av klassmallen användas class TradE<Person> { public: static bool lika (const D& d1, const D& d2) {return strcmp(d1.pnr, d2.pnr) == 0; static bool mindre(const D& d1, const D& d2) {return strcmp(d1.pnr, d2.pnr) < 0; // Skapa ett träd Trad<Person, TradE<Person> > t; OBS: En specialinstans av en klassmall skall inte föregås av template EDA623 (Föreläsning 12) HT 2013 21 / 29

Funktionsmallar Även vanliga funktioner kan vara generiska dvs ha mallar, s.k. funktionsmallar Exempel: Vanliga minimifunktionen template<class T> const T& min(const T& a, const T& b) { if (a < b) return a; else return b; EDA623 (Föreläsning 12) HT 2013 22 / 29

Funktionsmallar Instansiering av funktionsmallar sker i vissa fall automatiskt t.ex. vid utskrift: double x = 7.0, y = 5.0; long m = 5, n = 7; //... cout << min(x, y) << endl; cout << min(m, n) << endl; // Blandat funkar inte (ingen casting görs!) cout << min(m, y) << endl; // För att forcera casting blir man explicit cout << min<double>(m, y) << endl; EDA623 (Föreläsning 12) HT 2013 23 / 29

Funktionsmallar Funktionsmall för minsta elementet i ett fält template<class T> T& min_element(t f[], int n) { int m = 0; for (int i = 1; i<n; i++) if (f[i] < f[m]) m = i; return f[m]; EDA623 (Föreläsning 12) HT 2013 24 / 29

Funktionsmallar Funktionsmallar för byte och sortering template<class T> void byt(t& a, T& b) { T temp = a; a = b; b = temp; template<class T> void sort(t f[], int n) { for (int k = 0; k<n; k++) byt(f[k], min_element(f + k, n - k)); EDA623 (Föreläsning 12) HT 2013 25 / 29

Funktionsmallar Standardalgoritmerna är funktionsmallar! // Typparametern IT nedan är en iterator el. pekartyp template<class IT> IT min_element(it first, IT last) { IT m = first; for (IT i = ++first; i!= last; i++) if (*i < *m) m = i; return m; template<class IT> void sort(it first, IT last) { for (IT k = first; k!= last; k++) byt(*k, *min_element(k, last)); EDA623 (Föreläsning 12) HT 2013 26 / 29

Funktionsmallar Exempel på användning av algoritmerna double a[11] = { 11, 7, 3, 4, 9, 16, 13, 12, 19, 17, 21 ; list<int> l = { 11, 7, 3, 4, 9, 16, 13, 12, 19, 17, 21 ; //... cout << *min_element(a, a + 11) << endl; cout << *min_element(l.begin(), l.end()) << endl; sort(a, a + 11); //skriv(a, a + 11); sort(l.begin(), l.end()); //skriv(l.begin(), l.end()); EDA623 (Föreläsning 12) HT 2013 27 / 29

Funktionsmallar För klasser som inte har operatorn < definierad: // Compare är en egenskapsklass av funktionsobjektstyp template<class IT, class Compare> IT min_element(it first, IT last, Compare cmp) { IT m = first; for (IT i = ++first; i!= last; i++) if (cmp(*i, *m)) m = i; return m; // Egenskapsklassen måste ha funktionsdefinitionsop.: class Str_Less_Than { public: bool operator () (char *s1, char *s2) { return strcmp(s1, s2) < 0; ; EDA623 (Föreläsning 12) HT 2013 28 / 29

Funktionsmallar Exempel på användning med stränglista: // list<char *> tl = { "hej", "du", "glade" ; Str_Less_Than lt; // funktionsobjekt //... cout << *min_element(tl.begin(), tl.end(), lt); // Annan variant av ovanstående anrop: cout << *min_element(tl.begin(), tl.end(), Str_Less_Than()); // Här skapas automatiskt ett objekt av typ Str_Less_Than EDA623 (Föreläsning 12) HT 2013 29 / 29