Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

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

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

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

Innehåll. Klasserna vector och deque

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

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

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

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++

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna 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 6 - Undantag

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

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

Inlämningsuppgift, EDAF30, 2016

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

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

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

Kapitel 5. Strömmar. Utmatning

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ö

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

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

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

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.

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. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

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:

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

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

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

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

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

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

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)

Generiska konstruktioner. Kursbokens kapitel 13

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

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

Transkript:

Kapitel 4 Introduktion till mallar STL 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++ Johnny Bigert 2002 2 Mallar Funktionsmallar Klassmallar Medlemsfunktioner som mallfunktioner 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++ Johnny Bigert 2002 4 2D1387 Programsystemkonstruktion med C++ 1

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 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++ Johnny Bigert 2002 5 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 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>; A *b = fp(); fp = create<c>; A *c = fp(); // peka på B-factory // skapa ett B-objekt // peka på C-factory // skapa ett C-objekt 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++ Johnny Bigert 2002 7 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 8 2D1387 Programsystemkonstruktion med C++ 2

Klassmallar Mallar för medlemsfunktioner Funktionsmallar fungerar lika bra för klassmedlemmar // 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; a[2] = 5; // instansiera // ok: operator[] returnerar T& 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++ Johnny Bigert 2002 9 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 10 Specialisering Med en specialisering (specialization) särbehandlar man typer Specialisering Exempel på specialisering av medlem template<class T> void swap(t &t1, T &t2) T tmp = t1; t1 = t2; t2 = tmp; // klarar alla typer // byt plats 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! 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++ Johnny Bigert 2002 11 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 12 2D1387 Programsystemkonstruktion med C++ 3

Specialisering Exempel på specialisering av en klass STL Standard Template Library // 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 Strängar Behållare Iteratorer Algoritmer Hjälpstrukturer 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 13 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 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++ Johnny Bigert 2002 15 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 16 2D1387 Programsystemkonstruktion med C++ 4

std::pair Först, ett litet exempel på en hjälpklass Strängar i STL #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++ Johnny Bigert 2002 17 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. Strängar i STL Exempel på stränganvändning: #include <string> std::string s("c++"); s += " is great!"; // skapa sträng // 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++ Johnny Bigert 2002 19 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 20 2D1387 Programsystemkonstruktion med C++ 5

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 Vektorer i STL 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 21 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 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++ Johnny Bigert 2002 23 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 24 2D1387 Programsystemkonstruktion med C++ 6

Vektorer i STL Exempel på medlemsfunktioner: Listor i STL 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++ Johnny Bigert 2002 25 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 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++ Johnny Bigert 2002 27 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 28 2D1387 Programsystemkonstruktion med C++ 7

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 Avbildningar i STL 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 29 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 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++ Johnny Bigert 2002 31 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 32 2D1387 Programsystemkonstruktion med C++ 8

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 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 << "hoppsan" << std::endl; 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 33 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 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) Ö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++ Johnny Bigert 2002 35 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 36 2D1387 Programsystemkonstruktion med C++ 9

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 Iteratorer i STL 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 37 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 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++ Johnny Bigert 2002 39 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 40 2D1387 Programsystemkonstruktion med C++ 10

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) Algoritmer och funktionsobjekt 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 41 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 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++ Johnny Bigert 2002 43 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 44 2D1387 Programsystemkonstruktion med C++ 11

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 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++ Johnny Bigert 2002 45 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 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++ Johnny Bigert 2002 47 2D1387 Programsystemkonstruktion med C++ 12