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

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

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

Strömmar och strängar

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

Ö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

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

Tentamen *:85/2I4123 C

Innehåll. Klasserna vector och deque

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

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

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

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

Intro till standardbiblioteket. Eric Elfving

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

Standard Template Library STL. Behållarklasser

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

Tentamen EDAF30 Programmering i C++

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

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

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

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

Tentamen EDAF30 Programmering i C++

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

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

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

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

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

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

Föreläsning 5-7 Operatoröverlagring

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tommy Färnqvist, IDA, Linköpings universitet

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

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

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

TDIU01 - Programmering i C++, grundkurs

Innehåll. Pekare Exempel

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

Del6 Strömmar Ämnesområden denna föreläsning:

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

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

Innehåll. Pekare Exempel

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

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

C++-programmets beståndsdelar

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

Inlämningsuppgift, EDAF30, 2016

Tentamen EDAF30 Programmering i C++

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

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

Föreläsning 4 Innehåll

7 Templates och Exceptions

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

4. Standard-containers. Strömmar och filer

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

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursassistent: Mårten Björkman,

SP:PROG3 HT12 Tenta

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

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

Inlämningsuppgift, EDAF30, 2018

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

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

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

TDIU01 - Programmering i C++, grundkurs

TDDI14 Objektorienterad programmering

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

Programsystemkonstruktion med C++

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

Tillämpad programmering

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Det finns många flaggor till g++,

Tentamen EDAF30 Programmering i C++

maxlist-1. Indexerad lista Länkad lista

Generiska konstruktioner. Kursbokens kapitel 13

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

Tentamen EDAF30 Programmering i C++

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

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

Kapitel 6 - Undantag

DD2387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 4 september 2008

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

Föreläsning 2 Datastrukturer (DAT037)

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

Kapitel 5. Strömmar. Utmatning

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

TDIU01 Programmering i C++

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

TDIU01 - Programmering i C++, grundkurs

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

1 Klasser och objektorientering Vad är objektorientering?

Transkript:

2D1387, Programsystemkonstruktion med C++ 01/02 1 Slide 1 Del4 Klassmallar, funktionsmallar och STL Ämnesområden denna föreläsning: Funktionsmallar (function templates) Klassmallar Mallar för medlemmar Specialisering Standardbiblioteket för mallar (STL): Namnrymden std Iteratorer std::string, std::vector, std::list, std::map, std::set Algoritmer, funktionsobjekt Typinformation under körning Slide 2 Funktionsmallar Du vill skapa en funktion som kan användas med olika typer av objekt Man kan använda generiska datatyper, funktionspekare och typkonvertering, problemet är att programmet inte blir typsäkert Ett bättre alternativ är funktionsmallar (templates)

2D1387, Programsystemkonstruktion med C++ 01/02 2 class A { public: bool operator<(const A &a) const { return a.i < i; int i; ; Slide 3 template<class T> 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); Slide 4 Klassmallar För att skapa en vektorklass som innehåller godtycklig typ använder man en klassmall (class template): // i fil myarray.h template<class T, int SIZE> class MyArray { public: MyArray() { const T &operator[](int i) const; // this är konstant T & operator[](int i); // this är ej konst protected: T array[size]; ; #include "myarray.cpp" // obs! nödlösning

2D1387, Programsystemkonstruktion med C++ 01/02 3 // i fil myarray.cpp template<class T, int S> // obs hur klassen anges const T& MyArray<T,S>::operator[](int i) const { return array[i]; Slide 5 template<class T, int S> // obs hur klassen anges T& MyArray<T,S>::operator[](int i) { return array[i]; MyArray<int, 17> a; // instansiera a[2] = 5; // ok: kallar operator[], returnerar T& Mallar för medlemmar Funktionsmallar fungerar lika bra för klassmedlemmar Slide 6 class A { public: // konverteringsoper template<class T> operator T() const; int data; ; template<class T> A::operator T() const { cout << "typ: " << typeid(t).name() << endl; return T(data); // ok, men farligt A a; int i = a; // typ: int double d = a; // typ: double void *p = a; // typ: pointer to void

2D1387, Programsystemkonstruktion med C++ 01/02 4 Slide 7 Specialisering Ibland vet man hur man ska hantera vissa typer speciellt. Man kan då ange en specialisering (specialization). class A { public: template<class T> operator T() const; int data; ; template<class T> A::operator T() const { cout << "Unknown type" << endl; return 0; Slide 8 template<> A::operator int() const { cout << "type was int" << endl; return data; template<> A::operator double() const { cout << "type was double" << endl; return static_cast<double>(data);

2D1387, Programsystemkonstruktion med C++ 01/02 5 Exempel på specialisering av en klass // definition av vanlig mallklass template<class T> class A { T data; ; Slide 9 // 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 Slide 10 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 STL ligger i namnrymden std. Exempel på funktionalitet: strängar (#include <string>), genom std::string behållarklasser (containers) (t.ex. #include <vector> för att använda std::vector) med tilldelning och kopiering algoritmer (#include <algorithm>), genom t.ex. std::sort eller std::foreach

2D1387, Programsystemkonstruktion med C++ 01/02 6 Strängar i STL Standardbiblioteket bidrar med en kraftfull strängklass std::string. För minnese ektivitetens skull har de esta implementationer infört referensräkning. std::basic_string är en behållare som håller bokstäver såsom char eller wchar_t Slide 11 std::string är en typde nition av std::basic_string<char> 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) const bool empty() const, size_type size() const Exempel på stränganvändning: const char *c = "C++"; std::string s(c); s += " is great!"; // skapa sträng // lägg till sträng Slide 12 cout << "True: " // använd c_str() för << s.c_str() << endl; // tillgång till data cout << "Predecessor: " // använd oper[] för << s[0] << endl; // tillgång till bokstav reverse(s.begin(), s.end()); // vänd på strängen cout << s << endl;

2D1387, Programsystemkonstruktion med C++ 01/02 7 Vektorer i STL STL innehåller en mycket användbar behållare std::vector. Denna vektor, till skillnad från vektorer på stacken, har dynamisk allokering. C++-standarden anger att vektorer skall garantera uppslagning och insättning/borttagning sist i konstant tid Slide 13 Långsamma operationer är insättning efter/borttagning av godtyckligt element Exempel på medlemsfunktioner: void push_back(const T&), iterator erase(iterator pos) iterator insert(iterator pos, const T& x) iterator begin(), iterator end() void clear(), void reserve(size_t), size_type size() const Exempel på användning av std::vector: Slide 14 std::vector<int> v; // vektorn innehåller heltal v.insert(v.begin(), 3); // sätt in först assert(v.size() == 1 && // size() ger antal element v.capacity() >= 1 && // capacity() ger max antal // element innan omallokering v[0] == 3); // hämta element 0 v.push_back(7); v.pop_back(); // sätt in sist // ta bort sista elementet

2D1387, Programsystemkonstruktion med C++ 01/02 8 Iteratorer För att iterera över behållare i STL nns iteratorer. Dåman använder vector skulle man i många fall kunna använda indexoperatorn [], men för e ektivitetens och enhetlighetens skull har alla behållare en iteratorklass. Slide 15 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 elem if(*i == 7) // * ger utpekat elem cout << "Found '7' in element number " << (i - v.begin()) << endl; // ok: differens 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 Slide 16 Uppslagning av godtyckligt element är en långsam funktion eftersom man då måste iterera över elementen 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& x) iterator erase(iterator pos) bool empty() const, void clear(), size_type size() const

2D1387, Programsystemkonstruktion med C++ 01/02 9 Exempel på användning av std::list: Slide 17 std::list<int> l; l.push_back(0); l.push_front(1); l.insert(++l.begin(), 2); // listan innehåller heltal // lägg 0 bakerst // lägg 1 först // lägg 2 efter första elem. // listan innehåller nu 1 2 0 Avbildningar i STL För snabb uppslagning nns en behållarklass std::map C++-standarden anger att uppslagning och insättning med nyckel skall ske på sämst logaritmisk tid. std::map implementeras oftast som ett röd-svart träd Slide 18 Iteration över elementen sker i stigande nyckelordning 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++ 01/02 10 Exempel på användning av std::map: struct comp_string { bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; ; Slide 19 // avbildar char* till int, och ordnar // nycklarna enligt comp_string map<const char*, int, comp_string> months; months["januari"] = 31; months["februari"] = 28;... months["december"] = 31; cout << "juni har " << months["june"] << " dagar" << endl; Algoritmer I STL nns många användbara algoritmer. De opererar på iteratorer och eftersom iteratorer nns för alla behållare fungerar algoritmerna på alla behållare. Slide 20 #include <algorithm> // algoritmer int a[] = {1, 4, 2, 8, 5, 7; const int n = sizeof(a) / sizeof(int); // antal element sort(a, a + n); // sortering copy(a, a + n, // utmatning ostream_iterator<int>(cout, " ")); // 1 2 4 5 7 8 std::vector<int> b; b.push_back(7);... sort(b.begin(), b.end()); // sortering

2D1387, Programsystemkonstruktion med C++ 01/02 11 Funktionsobjekt När man använder funktionspekare sker alla anrop genom att avreferera pekaren. Samtidigt är det inte möjligt att göra funktionen inline. En bättre lösning är funktionsobjekt: Slide 21 struct less_abs { bool operator()(double x, double y) { return fabs(x) < fabs(y); ; vector<double> v;... sort(v.begin(), v.end(), less_abs()); // konstruera // less_abs-objekt vector<int> u(100); generate(u.begin(), u.end(), rand); // rand är fkt.pekare Typinformation under körning Genom operatorn typeid() får man en referens till en instans av klassen type_info som innehåller typinformation type_info har en metod name() som ger klassens namn Exempel på användning: Slide 22 class A {; A *a = new A; const type_info &ta = typeid(a); // typinfo på klass const type_info &ta = typeid(*a); // typinfo på objekt cout << ta.name() << endl; // namn på typ if(ta == ta) // typer kan jämföras cout << "They are the same" << endl; if(ta.before(ta)) // typer har en ordning cout << "ta is before ta" << endl;