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

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.

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

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

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

Programsystemkonstruktion med C++

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

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

Tillämpad programmering

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

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

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

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

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

Tentamen EDAF30 Programmering i C++

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

Tentamen EDAF30 Programmering i C++

Tillämpad programmering

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

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

Intro till standardbiblioteket. Eric Elfving

TDIU01 - Programmering i C++, grundkurs

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

Det finns många flaggor till g++,

Innehåll. Pekare Exempel

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

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Innehåll. Pekare Exempel

Tentamen *:85/2I4123 C

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

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

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

Tommy Färnqvist, IDA, Linköpings universitet

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 19.

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

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

Innehåll. 1 Algoritmer. 2 Strömmar och filer. 3 Iteratorer. 1 Söka, räkna. 2 Jämföra, genomlöpa. 3 Generera nya data. 4 Kopiera och flytta element

TDDC76 - Programmering och Datastrukturer

7 Templates och Exceptions

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

Innehåll. Klasserna vector och deque

TDDC76 - Programmering och Datastrukturer

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

TDIU01 - Programmering i C++, grundkurs

Innehåll. Relationer mellan klasser Operatoröverlagring. Static-medlemmar. Const- och referensmedlemmar. Const medlemsfunktioner

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

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

Tentamen EDAF30 Programmering i C++

TDIU01 Programmering i C++

Tentamen Objektorienterad Programutveckling med C++

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

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

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

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

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

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

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

Tentamen i DD2387 Programsystemkonstruktion med C++

Inlämningsuppgift, EDAF30, 2016

Tentamen C++-programmering

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

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

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Länkade strukturer. (del 2)

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

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

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

TDIU01 - Programmering i C++, grundkurs

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

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

Programsystemkonstruktion med C++

SP:PROG3 HT12 Tenta

Inlämningsuppgift, EDAF30, 2018

Tentamen EDAF30 Programmering i C++

1 Namnkontroll (NameControl)

Tentamen i DD2387 Programsystemkonstruktion med C++

TDDC76 Programmering och datastrukturer

Standard Template Library STL. Behållarklasser

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

TDIU01 - Programmering i C++, grundkurs

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

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

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

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Minnestilldelning (allokering) och frigörande (avallokering) av minne

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

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

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

Tentamen Programmering fortsättningskurs DIT950

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

TDIU01 - Programmering i C++, grundkurs

Transkript:

Generell (template) programmering Funktionsobjekt och funktionspekare Iteratorer Algoritmer Effektiv C++ Slutliga tips Genomgång av gammal tenta Daniel Aarno bishop@kth.se 2 int compare(int i1, int i2) return i1 < i2; class IntComparator public: int operator()(int i1, int i2) return i1 < i2; ; template<typename Func> int foo(func &f) return f(7,8); int main() int val = compare(5,78); //compare normal using function IntComparator comp; val = comp(67, 63); //compare using function object foo(*compare); //pass reference to function foo(comp); //pass reference to function object 4 Allt som fungerar som x ÄR x allt som fungerar som en iterator är en iterator allt som fungerar som en funktion är en funktion allt som fungerar som en behållare är en behållare Skriv funktioner så att de fungerar på allt som uppfyller konceptet för de objekt den opererar på Definera upp nya koncept där det behövs Måste vara generella (för att få bra abstraktion) Måste vara restrektiva (för effektiv implementation) 3

ostream& operator<<(ostream& os, const vector<t> &v) string sep = ""; ofstream *ofs = dynamic_cast<ofstream*>(&os); if(ofs!= 0) os << v.size(); sep = " "; for(typename vector<t>::const_iterator it = v.begin(); it!= v.end(); ++it) os << sep << *it; sep = " "; //C sorting function qsort void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *)); //Integer comparsion int int_comp(const void* a, const void* b) return *((const int*)a) < *((const int*)b); //Typedef of a function pointer typedef int (*comparator_t)(const void *, const void *); int main() const int nmemb = 12; int v[nmemb]; return os; //Sort array v using int_comp //(note int_comp is a function POINTER) qsort(v, nmemb, sizeof(int), int_comp); 6 //Use the typedef:ed type to store a pointer to a //function comparator_t mycomp = int_comp; qsort(v, nmemb, sizeof(int), int_comp); 5 istream& ReadVec(ifstream& is, vector<t> &outvec) int nmemb; is >> nmemb; outvec.clear(); istream_iterator<t> isi(is); copy(isi, istream_iterator<t>(), back_inserter (outvec)); return is; istream& operator>>(istream& is, vector<t> &outvec) ifstream *ifs = dynamic_cast<ifstream*>(&is); if(ifs!= 0) return ReadVec(*ifs, outvec); string line; getline(is, line); outvec.clear(); istringstream iss(line); T val; while(iss >> val) outvec.push_back(val); return is; 8 7

class A public: void foo() ; int main() int v[678]; sort(v, v + 678, greater<int>()); vector<int> iv(678); transform(v, v + 678, iv.begin(), v, plus<int>()); transform(v, v + 678, iv.begin(), bind2nd(plus<int>(),10)); ostream& operator<<(ostream& os, const vector<t> &v) ofstream *ofs = dynamic_cast<ofstream*>(&os); if(ofs!= 0) os << v.size() << ' '; copy(v.begin(), v.end(), ostream_iterator<t>(os, " ")); return os; vector<a> av(56); for_each(av.begin(), av.end(), mem_fun_ref(&a::foo)); void (A::*foo_func)(void) = &A::foo; A a; (a.*foo_func)(); 10 9 25 22.5 Search time Performance test 20 17.5 C Time (s) 15 12.5 10 7.5 5 Language C++ Vector addition Primes computation 2.5 0 O0 O1 O2 O3 Os JAVA Maxflow med 1000 + 1000 noder och 20000 kanter 0 5 10 15 20 25 30 35 40 Execution time (s) 12 11

Return by value Matrix operator+(const Matrix& a, const Matrix& b) Matrix c; Matrix& operator+(const Matrix& a, const Matrix& b) Matrix c; Matrix& operator+(const Matrix& a, const Matrix& b) Matrix *c = new Matrix; Undvik temporära objekt Använd initialiseringslista Undvik return-by-value Var noggran med iteratorer Använd std funktioner, algoritmer etc Optimera där det hjäper Matrix& operator+(const Matrix& a, const Matrix& b) static Matrix c; void add(const Matrix &a, const Matrix &b, Matrix dest) 14 13 struct Student string name; string addr; ; string FindAddr(list<Student> l, string name for(list<student>::iterator i = l.begin(); i!= l.end(); i++) if(*i == name) return i->addr; return ; Finn 5 fel Template <typename T> void foo(u &a, U &b) cout << foo() << endl; Template <typename T> void bar(const U &a, const U &b) cout << bar() << endl; int main () int i = 2; char c = 'a'; foo<int>(i,c); //< will not compile because temporary //< objects may not be changed bar<int>(i,c); //< compiles OK 16 15

struct Student string name; string addr; ; struct Student string name; string addr; ; Ej const& const string& FindAddr(const list<student> &l, const string &name static const string dummy; for(list<student>::const_iterator i = l.begin(); i!= l.end(); ++i) if(i->name == name) return i->addr; return dummy; string FindAddr(list<Student> l, string name) for(list<student>::iterator i = l.begin(); i!= l.end(); i++) if(*i == name) return i->addr; return ; ++i är snabbare i->name 18 17 class Guvernor string knowledge; //... ; class Actor : public Governor string lines; //... Actor& operator=(const Actor &a) if(this!= &a) lines = a.lines; //DOH! knowledge is not copied ; //This is the fix Actor& Actor::operator=(const Actor &a) Guvernor::operator=(a); //OK if operator= is not virtual (but it should be) //*(static_cast<guvernor*>(this)) = a; class NameEq const string &m_name; public: NameEq(const std::string &nam) : m_name(nam) bool operator()(const Student& s) return s.name == m_name; ; const string& FindAddr(const list<student> &l, const string &name static const string dummy; list<student>::const_iterator it = find_if(l.begin(), l.end(), NameEq(name)); return it!= l.end()? *it : dummy; if(this!= &a) lines = a.lines; 20 19

Kan en iterator avrefereras? e.end() kan inte! Är iteratorn giltig, tex efter allokering av nytt minne, insättning eller borttagning från en container? Har ett iteratorpar giltigt intervall? Göm interna funktioner i tomt namespace Överlagra bara virtual Var noggrann med const, speciellt i bibliotekskod Skilj på ISA och HASA 21