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

Relevanta dokument
Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

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

Strömmar och strängar

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

Tentamen *:85/2I4123 C

Intro till standardbiblioteket. Eric Elfving

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

Innehåll. Klasserna vector och deque

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

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

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen EDAF30 Programmering i C++

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Standard Template Library STL. Behållarklasser

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

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen EDAF30 Programmering i C++

Tentamen EDAF30 Programmering i C++

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

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

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005

SP:PROG3 HT12 Tenta

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

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

Kapitel 6 - Undantag

Övningsuppgifter. TDIU04 Programmering i C++, standardbibliotek. Innehåll. Vt Lektion Lektion Lektion Lektion 4...

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

Inlämningsuppgift, EDAF30, 2016

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Det finns många flaggor till g++,

Innehåll. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Innehåll. Pekare Exempel

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

C++-programmets beståndsdelar

Inlämningsuppgift, EDAF30, 2018

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

Programsystemkonstruktion med C++

Innehåll. Pekare Exempel

Lösningsförslag till tentamen TDP004 Objektorienterad Programmering Teoretisk del

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

Användning av typeid. Operatorerna typeid och. Filen typeinfo.h måste inkluderas. typeid

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

TDIU06 Programmering g.k. Laborationer LAB2. Vt1, Dessa laborationer ingår i examinationsmomentet LAB2 och ska göras i läsperiod Vt1.

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

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

Föreläsning 4 Innehåll

grundläggande C++, funktioner m.m.

Kapitel 5. Strömmar. Utmatning

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

Tentamen EDAF30 Programmering i C++

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

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

Föreläsning 5-7 Operatoröverlagring

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Symboliska konstanter const

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 2 september 2006

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen C++-programmering

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

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

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

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

Föreläsning 11 Genomgång av inlämningsuppgiften

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

Programmering för språkteknologer II, HT2011. Rum

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Objektorienterad programmering i Java

Länkade strukturer. (del 2)

Samlingar Collection classes

Tommy Färnqvist, IDA, Linköpings universitet

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

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

Standard Template biblioteket, eller STL, är ett C++ bibliotek innehållande: STL tillhandahåller många grundläggande algoritmer och datastrukturer:

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Innehåll. Datatyper Pekare, Arrayer och Referenser. Pekare. Pekare Syntax. Pekare Syntax, operatorerna * och & 5. Pekare och arrayer. Algoritmer.

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

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

TDDI14 Objektorienterad programmering

Tentamen i DD2387 Programsystemkonstruktion med C++

4. Standard-containers. Strömmar och filer

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

Föreläsning 2 Datastrukturer (DAT037)

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

Generiska konstruktioner. Kursbokens kapitel 13

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Tentamen i DD2387 Programsystemkonstruktion med C++

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

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

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Transkript:

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

Kapitel 4 - Klassmallar, funktionsmallar och STL Funktionsmallar Klassmallar Mallar för medlemmar Specialisering Standardbiblioteket för mallar (STL): Namnrymden std std::string STL-behållare (vector, list, map, deque, set, multimap, multiset) Iteratorer, algoritmer, funktionsobjekt 2D1387 Programsystemkonstruktion med C++ 2

Mallar Funktionsmallar Klassmallar Medlemsfunktioner som mallfunktioner 2D1387 Programsystemkonstruktion med C++ 3

Funktionsmallar Antag att du har två likadana funktioner med den enda skillnaden att de arbetar på olika typer (t.ex. double och int) Ett bättre alternativ är då funktionsmallar (function templates) Typen blir en parameter till funktionen och bestäms vid kompileringstillfället 2D1387 Programsystemkonstruktion med C++ 4

Funktionsmallar Typen är en parameter T Gränssnitet för alla typer T måste klara allt som funktionen begär, t.ex. +, = och anrop till en funktion print() Detta medför att man kan skriva en funktion ovetandes om vilken typ den ska arbeta på, så länge typen uppfyller kraven på gränssnittet Man talar om polymorfi vid kompileringstillfället 2D1387 Programsystemkonstruktion med C++ 5

Funktionsmallar Ett första exempel på funktionsmall class A { // A är en klass som klarar av att jämföras public: bool operator<(const A &a) const { return i < a.i; } int i; }; template<class T> // funktionen max använder operator< const T &max(const T &t1, const T &t2) { return t1 < t2? t2 : t1; } A a, b; max(a, b); max(2.14, 3.14); 2D1387 Programsystemkonstruktion med C++ 6

Funktionsmallar Ett mer avancerat exempel på funktionsmall struct A { virtual ~A() {} }; struct B : A {}; struct C : A {}; template<class T> // generisk factoryfunktion A *create() // returnerar pekare till basklass { return new T; // skapa instans av typ T } A* (*fp)(); // funktionspek, inga arg, returnera A* fp = create<b>; // peka på B-factory A *b = fp(); // skapa ett B-objekt fp = create<c>; // peka på C-factory A *c = fp(); // skapa ett C-objekt 2D1387 Programsystemkonstruktion med C++ 7

Klassmallar För att skapa en vektorklass som innehåller godtycklig typ använder man en klassmall (class template): // i fil array.h template<class T> class Array { public: Array() {} const T &operator[](int i) const; // this är konstant T & operator[](int i); // this är ej konst protected: T array[100]; };... 2D1387 Programsystemkonstruktion med C++ 8

Klassmallar // fortsättning på fil array.h template<class T> // obs hur klassen anges const T& Array<T>::operator[](int i) const { return array[i]; } template<class T> // obs hur klassen anges T& Array<T>::operator[](int i) { return array[i]; } Array<int> a; // instansiera a[2] = 5; // ok: operator[] returnerar T& 2D1387 Programsystemkonstruktion med C++ 9

Mallar för medlemsfunktioner Funktionsmallar fungerar lika bra för klassmedlemmar class A { public: template<class T> void foo(t t) const { std::cout << "type: " << typeid(t).name() << std::endl; } }; A a; void *p = 0; a.foo(7); // type: int a.foo(3.14); // type: double a.foo(p); // type: void * a.foo(a); // type: class A 2D1387 Programsystemkonstruktion med C++ 10

Specialisering Med en specialisering (specialization) särbehandlar man typer template<class T> // klarar alla typer void swap(t &t1, T &t2) { T tmp = t1; // byt plats t1 = t2; t2 = tmp; } template<> // specialisering för Vector void swap(vector &v1, Vector &v2) { swap(v1.size, v2.size); // byt storlek swap(v1.p, v2.p); // byt pekare! } 2D1387 Programsystemkonstruktion med C++ 11

Specialisering Exempel på specialisering av medlem class A { public: template<class T> void foo(t) const { std::cout << "Unknown type" << std::endl; } template<> void foo(int) const { std::cout << "type was int" << std::endl; } template<> void foo(double) const { std::cout << "type was double" << std::endl; } }; 2D1387 Programsystemkonstruktion med C++ 12

Specialisering Exempel på specialisering av en klass // definition av vanlig mallklass template<class T> class A { T data; }; // specialisering, denna definition skapas för pekare // av alla typer, T blir typen som pekas på template<class T> class A<T *> { T data; T *ptr; }; // specialisering, denna definition skapas för void* template<> class A<void *> {}; // ingen typ T finns 2D1387 Programsystemkonstruktion med C++ 13

STL Standard Template Library Strängar Behållare Iteratorer Algoritmer Hjälpstrukturer 2D1387 Programsystemkonstruktion med C++ 14

Standardbiblioteket för mallar C++-standarden kräver att varje implementation av C++ kommer med ett stort antal mallar för klasser och funktioner. Biblioteket kallas Standard template library (STL). Allt innehåll i standardbiblioteket ligger i namnrymden std, t.ex. std::string 2D1387 Programsystemkonstruktion med C++ 15

Standardbiblioteket för mallar Exempel på funktionalitet i STL: strängar (#include <string>) genom std::string behållarklasser (containers) (t.ex. #include <vector> för att använda std::vector) algoritmer (#include <algorithm>) genom t.ex. std::sort eller std::foreach Funktorer och hjälpklasser 2D1387 Programsystemkonstruktion med C++ 16

std::pair Först, ett litet exempel på en hjälpklass #include <utility> // för pair och make_pair int main() { std::string s = "hej"; std::pair<int, std::string> pr; // skapa objekt pr = std::make_pair(7, s); // skapa nytt par std::cout << pr.first << ", " // åtkomst << pr.second << std::endl; } return 0; 2D1387 Programsystemkonstruktion med C++ 17

Strängar i STL 2D1387 Programsystemkonstruktion med C++ 18

Strängar i STL Standardbiblioteket bidrar med en kraftfull strängklass std::string. std::basic_string är en behållare som håller bokstäver såsom char eller wchar_t std::string är en typdefinition av std::basic_string<char> För minneseffektivitetens skull har de flesta implementationer infört referensräkning. 2D1387 Programsystemkonstruktion med C++ 19

Strängar i STL Exempel på stränganvändning: #include <string> std::string s("c++"); // skapa sträng s += " is great!"; // lägg till sträng std::cout << "True: " // använd c_str() för << s.c_str() << std::endl; // tillgång till data std::cout << "Predecessor: " // använd oper[] för << s[0] << std::endl; // tillgång till bokstav std::reverse(s.begin(), s.end()); // vänd på strängen std::cout << s << std::endl; 2D1387 Programsystemkonstruktion med C++ 20

Strängar i STL Exempel på medlemsfunktioner: basic_string& operator+=(const basic_string& s) basic_string& insert(size_type pos, const basic_string& s) iterator erase(iterator first, iterator last) size_type find_first_of(const basic_string& s) bool empty() const size_type size() const 2D1387 Programsystemkonstruktion med C++ 21

Vektorer i STL 2D1387 Programsystemkonstruktion med C++ 22

Vektorer i STL STL innehåller en mycket användbar behållare std::vector Vektorn i STL har dynamisk allokering, till skillnad från C-vektorer C++-standarden anger att vektorer skall garantera uppslagning och insättning / borttagning sist i konstant tid Långsamma operationer är insättning / borttagning på godtycklig plats 2D1387 Programsystemkonstruktion med C++ 23

Vektorer i STL Exempel på användning av std::vector: std::vector<int> v; // vektorn innehåller heltal v.push_back(3); // sätt in sist assert(v.size() == 1 && // size() ger antal element v.capacity() >= 1 && // capacity() ger max antal // element utan omallokering v.back() == 3); // hämta sista elementet v.push_back(7); // sätt in sist v.pop_back(); // ta bort sista elementet for(int i = 0; i < v.size(); i++) // skriv ut ett std::cout << v[i] << std::endl; // element i taget 2D1387 Programsystemkonstruktion med C++ 24

Vektorer i STL Exempel på medlemsfunktioner: void push_back(const T &) iterator erase(iterator pos) iterator insert(iterator pos, const T &) iterator begin() iterator end() void clear() void reserve(size_t) size_type size() const size_type length() const 2D1387 Programsystemkonstruktion med C++ 25

Listor i STL 2D1387 Programsystemkonstruktion med C++ 26

Listor i STL STLs lista är en implementation som har samma egenskaper som en dubbellänkad lista C++-standarden anger att insättning och borttagning skall ske på konstant tid Uppslagning av godtyckligt element är en långsam funktion eftersom man då måste iterera över elementen 2D1387 Programsystemkonstruktion med C++ 27

Listor i STL Exempel på användning av std::list: std::list<int> l; // listan innehåller heltal l.push_back(0); // lägg 0 sist l.push_front(1); // lägg 1 först l.insert(++l.begin(), 2); // lägg 2 efter första elem. // listan innehåller nu 1 2 0 2D1387 Programsystemkonstruktion med C++ 28

Listor i STL Exempel på medlemsfunktioner: void push_front(const T &) void push_back(const T &) void pop_front() void pop_back() iterator insert(iterator pos, const T &) iterator erase(iterator pos) bool empty() const void clear() size_type size() const 2D1387 Programsystemkonstruktion med C++ 29

Avbildningar i STL 2D1387 Programsystemkonstruktion med C++ 30

Avbildningar i STL För snabb uppslagning finns en behållarklass std::map C++-standarden anger att uppslagning och insättning skall ske på logaritmisk tid std::map implementeras oftast som ett rödsvart träd Iteration över elementen sker i stigande nyckelordning, t.ex. i bokstavsordning för std::string 2D1387 Programsystemkonstruktion med C++ 31

Avbildningar i STL Exempel på användning av std::map: struct comp_string { bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; } }; // avbildar char* till int, och ordnar // nycklarna enligt comp_string std::map<const char*, int, comp_string> months; months["januari"] = 31; months["februari"] = 28;... months["december"] = 31; std::cout << "juni har " << months["june"] << " dagar" << std::endl; 2D1387 Programsystemkonstruktion med C++ 32

Avbildningar i STL Exempel på medlemsfunktioner: iterator find(const key_type& k) pair<iterator, bool> insert(const value_type& x) size_type erase(const key_type& k) void clear() size_type size() const 2D1387 Programsystemkonstruktion med C++ 33

Avbildningar i STL Varning och tips på användning typedef std::map<std::string, std::string> map; map m; // operator[] lägger in nytt element m["mr. Brown"] = "Mrs. Brown"; m["mr. Green"] = "Mrs. Green"; // operator[] lägger in nytt element även här // och returnerar tomma strängen if(m["mr. Black"] == "") std::cout << "hoppsan" << std::endl; // bättre: använd iteratorer map::const_iterator it = m.find("mr. Red"); if(it!= m.end()) std::cout << it->second << std::endl; 2D1387 Programsystemkonstruktion med C++ 34

Övriga STL-behållare Vi har talat om dessa: string, vector, list, map Man bör också känna till: deque (double ended queue) set (ordnad mängd utan dubletter) multimap och multiset (map och set, fast tillåter dubletter) 2D1387 Programsystemkonstruktion med C++ 35

Övriga STL-behållare Derivat som använder sig av de tidigare nämnda behållarna: stack (först in sist ut) priority_queue (högst värde ut först) Numeriska behållare: bitset (sträng av ettor och nollor) valarray (matematiska vektorer) 2D1387 Programsystemkonstruktion med C++ 36

Hashtabeller En vanlig fråga är var man kan hitta hashtabeller i standardbiblioteket Svaret är att det inte finns några Dock kommer dessa förmodligen i nästa standard Se SGIs hemsida (www.sgi.com/tech/stl) för dokumentation av hash_map, hash_set, hash_multimap, hash_multiset 2D1387 Programsystemkonstruktion med C++ 37

Iteratorer i STL 2D1387 Programsystemkonstruktion med C++ 38

Iteratorer För att iterera över behållare i STL finns iteratorer Syntaxen hos de överlagrade operatorerna i iteratorklassen imiterar pekarens syntax Iteratorer finns i varje behållarklass och heter T::iterator och T::const_iterator 2D1387 Programsystemkonstruktion med C++ 39

Iteratorer std::vector<int> v; std::vector<int>::iterator i; // skapa iterator... // iterera: jämför med v.end() som är utanför vektorn for(i = v.begin(); i!= v.end(); i++) // ++ ger nästa if(*i == 7) // * avrefererar { std::cout << "Found '7' in element number " << std::distance(v.begin(), i) << std::endl; } 2D1387 Programsystemkonstruktion med C++ 40

Iteratorer Olika typer av iteratorer (iteratorhierarkin): std::random_access_iterator ++ -- += -= + - * < <= => >!= = std::bidirectional_iterator ++ -- *!= = std::forward_iterator ++ *!= = std::output_iterator och std::input_iterator ++ *!= Dessa är implementerade som tomma basklasser. De används för att bestämma typ (genom t.ex. referens) 2D1387 Programsystemkonstruktion med C++ 41

Algoritmer och funktionsobjekt 2D1387 Programsystemkonstruktion med C++ 42

Algoritmer I STL finns många användbara algoritmer Samtliga algoritmer opererar på iteratorer Iteratorer finns för alla behållare och algoritmerna fungerar därför på alla behållare Detta gäller även dem man skriver själv, förutsatt att iteratorn uppfyller villkoren 2D1387 Programsystemkonstruktion med C++ 43

Algoritmer #include <algorithm> // algoritmer int a[] = {1, 4, 2, 8, 5, 7}; const int n = sizeof(a) / sizeof(int); // antal element std::sort(a, a + n); // sortera std::copy(a, a + n, // mata ut std::ostream_iterator<int>(std::cout, " ")); std::vector<int> b; b.push_back(7);... std::sort(b.begin(), b.end()); // sortera std::unique(b.begin(), b.end()); // ta bort dubletter 2D1387 Programsystemkonstruktion med C++ 44

Funktionsobjekt Funktionsobjekt (function objekt) är objekt som imiterar syntaxen hos en funktion En fördel i jämförelsen med funktionspekare är att funktionsobjekt kan innehålla data När man använder funktionspekare sker alla anrop genom att avreferera pekaren. Samtidigt är det svårt att göra funktionen inline 2D1387 Programsystemkonstruktion med C++ 45

Funktionsobjekt struct less_abs { bool operator()(double x, double y) { return fabs(x) < fabs(y); } }; std::vector<double> v;... // konstruera less_abs-objekt std::sort(v.begin(), v.end(), less_abs()); // rand är fkt.pekare std::vector<int> u(100); std::generate(u.begin(), u.end(), rand); 2D1387 Programsystemkonstruktion med C++ 46

Funktionsobjekt Skilj på typer och objekt (instanser av typer) struct A { int i; }; struct Comp { bool operator()(const A &a, const A &b) const { return a.i < b.i; } }; // Comp är en typ och används inuti std::map // vid kompileringstillfället std::map<a, A, Comp> m; // Comp() är en instans och används i funktionen // std::sort vid körningstillfället std::vector<a> v; std::sort(v.begin(), v.end(), Comp()); 2D1387 Programsystemkonstruktion med C++ 47