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



Relevanta dokument
Innehåll. Klasserna vector och deque

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

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

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

Intro till standardbiblioteket. Eric Elfving

Standard Template Library STL. Behållarklasser

4. Standard-containers. Strömmar och filer

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

TDIU01 - Programmering i C++, grundkurs

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

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

Tommy Färnqvist, IDA, Linköpings universitet

Innehåll. 1 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

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

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

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

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

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

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

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

TDIU01 - Programmering i C++, grundkurs

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Datastrukturer. föreläsning 3. Stacks 1

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

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

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

Tentamen EDAF30 Programmering i C++

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

Objektorienterad programmering

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Föreläsning 4 Innehåll

Länkade strukturer. (del 2)

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

Tentamen *:85/2I4123 C

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

ADT Set, Map, Dictionary. Iteratorer TDDD86: DALGP. Tommy Färnqvist, IDA, Linköpings universitet

TDIU01 - Programmering i C++, grundkurs

Programmering i C++ EDAF hp. EDAF30 (Föreläsning 2) HT / 18

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

Tentamen EDAF30 Programmering i C++

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

Föreläsning Datastrukturer (DAT036)

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

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

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

Datalogi, grundkurs 1. Lösningsförslag till tentamen

TDIU01 (725G67) - Programmering i C++, grundkurs

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

maxlist-1. Indexerad lista Länkad lista

TDDC76 - Programmering och Datastrukturer

Datastrukturer och algoritmer

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

TDIU01 Programmering i C++

Föreläsning 4 Datastrukturer (DAT037)

TDDC76 - Programmering och Datastrukturer

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

Tentamen EDAF30 Programmering i C++

Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

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

Föreläsning 4 Datastrukturer (DAT037)

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Tecken. char. char ch = A ; sizeof(char) = 1 byte (ej 16-bitars tecken som i Java) char namn[]= "Nils"; // längd = 5 bytes

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

TDIU01 - Programmering i C++, grundkurs

Föreläsning 3 Datastrukturer (DAT037)

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

TDIU01 - Programmering i C++, grundkurs

C++ - En introduktion

Datastrukturer och algoritmer

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

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

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

Samlingar Collection classes

7 Templates och Exceptions

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

Tentamen i Algoritmer & Datastrukturer i Java

Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

Repetition av OOP- och Javabegrepp

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Föreläsning 3-4 Innehåll

Tentamen i Algoritmer & Datastrukturer i Java

Repetition av OOP- och Javabegrepp

TDIU01 - Datortenta (DAT2)

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

17.7 Funktioner för listor och köer

Transkript:

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

Containerklasser och algoritmbibliotek Innehåll Containerklasser Klasserna vector och deque Iteratorer Algoritmer Funktionsobjekt Standardklassen list Avbildningar och mängder Köer och stackar EDA623 (Föreläsning 10) HT 2013 2 / 33

Containerklasser Klassificering Sekvenser vector deque list S. k. adapterklasser implementerade med ovanstående klasser queue priority_queue stack Associativa containers set multiset map multimap EDA623 (Föreläsning 10) HT 2013 3 / 33

Klasserna vector och deque Med containerklasser avses klasser som beskriver datasamlingar av olika slag, t.ex. vektorer, listor, mängder eller avbildningar Två typiska exempel Klassen vector Klassen deque(double-ended queue) Kräver direktiven (respektive) #include <vector> #include <deque> EDA623 (Föreläsning 10) HT 2013 4 / 33

Klasserna vector och deque Operationer i klassen vector v.clear(), v.size(), v.empty() v.push_back(), v.pop_back() v.front(), v.back() v.at(i), v[i] v.assign(n, e), v.resize(n, e) Ytterligare operationer i klassen deque d.push_front(), d.pop_front() EDA623 (Föreläsning 10) HT 2013 5 / 33

Klasserna vector och deque Typen av element anges innanför hakar <> Exempel vector<double> vd1; // vektor med flyttal vector<int> vi1; // vektor med heltal // Både vd1 och vi1 blir tomma (0 element) vector<int> vi2(5); // vektorn {0, 0, 0, 0, 0} vector<double> vd2(2,1.2); // vektorn {1.2, 1.2} vector<int> vi3(vi2); // vi3 blir kopia av vi2 vi1 = vi3; // vi1 blir kopia av vi3 cout << vi3.size() << endl; // skriver ut 5 vd2.resize(4); // vd2 blir {1.2, 1.2, 0.0, 0.0} bool tom = vd1.empty(); // ger tom = true EDA623 (Föreläsning 10) HT 2013 6 / 33

Klasserna vector och deque Fler exempel vector<int> v; v.assign(3, 1); // v blir {1, 1, 1} v.at(1) = 2; // {1, 2, 1} v.push_back(9); // {1, 2, 1, 9} v.push_back(4); // {1, 2, 1, 9, 4} v.pop_back(); // {1, 2, 1, 9} deque<int> d; d.push_back(3); // d blir {3} d.push_front(2); // {2, 3} d.push_front(1); // {1, 2, 3} d.pop_back(); // {1, 2} d.pop_front(); // {2} EDA623 (Föreläsning 10) HT 2013 7 / 33

Iteratorer Iterator Pekarliknande variabel som används för att genomlöpa en struktur (datasamling) Exempel vector<double> v(4); vector<double>::iterator it; for (it=v.begin(); it!= v.end(); it++) *it = 0; // Ekvivalent i C++11 vector<double> v(4); for (double &e : v) e = 0; EDA623 (Föreläsning 10) HT 2013 8 / 33

Iteratorer Olika typer av iteratorer con symboliserar någon av containertyperna vektor, deque eller list con::iterator<typ> con::const_iterator<typ> con::reverse_iterator<typ> con::const_reverse_iterator<typ> löper framåt löper framåt, endast för avläsning löper bakåt löper bakåt, endast för avläsning EDA623 (Föreläsning 10) HT 2013 9 / 33

Iteratorer Funktioner som returnerar iteratorer och som finns i alla containerklasser + klassen string begin() end() rbegin() rend() ger en iterator som pekar på det första elementet ger en iterator som pekar på ett tänkt element efter det sista elementet ger en reverserad iterator som pekar på det sista elementet ger en reverserad iterator som pekar på ett tänkt element före det första elementet EDA623 (Föreläsning 10) HT 2013 10 / 33

Iteratorer Operationer med iteratorer som parametrar (iteratorintervallet [i,j) betecknar intervallet från och med i till och med positionen före j) sekv<typ> s(i,j); s.assign(i,j); s.insert(p,e); s.insert(p,n,e); s.insert(p,i,j); s.erase(p); s.erase(p,p2); skapar en sekvens som initeras med [i,j) tilldelar elem. i intervallet [i,j) till s inför värdet e i positionen (iterator) p inför n st e i positionen p inför elem. i intervallet [i,j) i pos. p tar bort elem. i pos. p från s tar bort elem. i intervallet [p,p2)från s EDA623 (Föreläsning 10) HT 2013 11 / 33

Iteratorer Exempel med iteratorer som parametrar int a[] = {5, 6, 7, 8, 9}; vector<int> v(a, a+4); // v = {5, 6, 7, 8} list<int> l(v.begin(), v.end());//l={5,6,7,8} l.assign(a, a+2); // l = {5, 6} list<int>::iterator it = l.begin(); l.insert(it, 2, 4); // l = {4, 4, 5, 6} l.insert(l.begin(), 3); // l = {3, 4, 4, 5, 6} it = l.begin(); l.erase(++it); // l = {3, 4, 5, 6} l.insert(l.begin(), v.begin(), v.end()); // l = {5, 6, 7, 8, 3, 4, 5, 6} EDA623 (Föreläsning 10) HT 2013 12 / 33

Algoritmer Tillgång till standardalgoritmer i C++ fås med direktivet #include <algorithm> Numeriska algoritmer ingår inte i detta bibliotek utan kräver direktivet #include <numeric>> Ett 30-sidigt appendix (App C) i boken ger detaljer om varje algoritm EDA623 (Föreläsning 10) HT 2013 13 / 33

Algoritmer Huvudkategorier av algoritmer (från App C) 1 Söka 2 Jämföra, genomlöpa, räkna 3 Kopiera och flytta element 4 Ändra och ta bort element 5 Generera nya data 6 Sortera 7 Operationer på sorterade datasamlingar 8 Operationer på mängder 9 Numeriska algoritmer 10 Heap-algoritmer EDA623 (Föreläsning 10) HT 2013 14 / 33

Algoritmer Exempel från kategorierna 3 resp. 1: copy, find int a[] = {5, 6, 7, 8, 9}; vector<int> v(a, a+4); // v = {5, 6, 7, 8} deque<int> d(6, 1); // d = {1, 1, 1, 1, 1, 1} copy(v.begin(), v.end(), d.begin()); // d = {5, 6, 7, 8, 1, 1} if (find(d.begin(), d.end(), 8)!= d.end()) cout << "finns" << endl; // d.end() är pos. efter d s sista element EDA623 (Föreläsning 10) HT 2013 15 / 33

Algoritmer Insättningsiteratorer #include <iterator> back_inserter, front_inserter, inserter Exempel int a[] = {4, 5, 6, 7, 8, 9}; list<int> e; //Obs! e är tom copy(a, a+4, back_inserter(e)); // e = {4, 5, 6, 7} copy(a+2, a+6, front_inserter(e)); // e = {9, 8, 7, 6, 4, 5, 6, 7} (Obs! ordningen) list<int>::iterator it=e.begin(); it++; copy(a+1, a+3, inserter(e, it)); // e = {9, 5, 6, 8, 7, 6, 4, 5, 6, 7} EDA623 (Föreläsning 10) HT 2013 16 / 33

Funktionsobjekt Funktionsobjekt är (som man kan misstänka) släkt med funktionspekare. Algoritmen transform (från Kat. 5 i App C) kan hantera båda varianterna. Först visas ett exempel med funktionspekare int kvad(int x) { return x*x; } int a[] = {1, 2, 3, 5, 8}; vector<int> v(a, a+5); // v = {1, 2, 3, 5, 8} vector<int> w; // w är tom! transform(v.begin(), v.end(), inserter(w, w.begin()), kvad); // w = {1, 4, 9, 25, 64} EDA623 (Föreläsning 10) HT 2013 17 / 33

Funktionsobjekt Ett funktionsobjekt är ett objekt från en klass som har överlagrat funktionsanropsoperatorn () Fortsättning på föregående exempel fast med funktionsobjekt class Kvadrerare { public: int operator() (int x) const { return x*x; } }; Kvadrerare k; // k(x) returnerar x*x int a[] = {1, 2, 3, 5, 8}; vector<int> v(a, a+5); // v = {1, 2, 3, 5, 8} vector<int> ww; // ww är också tom! transform(v.begin(), v.end(), inserter(ww, ww.begin()), k); // ww = {1, 4, 9, 25, 64} } EDA623 (Föreläsning 10) HT 2013 18 / 33

Funktionsobjekt Fördefinierade funktionsobjekt kräver direktivet #include <functional> Fördefinierat funktionsobjekt skapas med operation<typ>() där operation är något av följande plus, minus, multiplies, divides, modulus, negate, equal_to, not_equal_to, greater, less, greater_equal, less_equal, logical_and, logical_or, logical_not EDA623 (Föreläsning 10) HT 2013 19 / 33

Standardklassen list Liksom vector och deque utgör list en implementering av sekvenser Intern representation är en s.k. länkad lista (och inte fält som i fallen vector och deque) list<int> l; l.push_back(4); l.push_back(5); l.push_back(2); EDA623 (Föreläsning 10) HT 2013 20 / 33

Standardklassen list Operationerna på en list är samma som på en deque förutom att vektorindexering ([] och at()) inte är tillåten. Utöver det finns följande operationer l.reverse() Vänder bak och fram på listan l l.remove(e) Tar bort alla e:n från listan l l.unique() Tar bort alla förekomster, utom den första, ur varje sammanhägande grupp av lika element i listan l l.merge(l2) Sorterar in listan l2 i listan l l.splice(p,l2) Skjuter in elementen i listan l2 i listan l, före platsen p (iterator). Listan l2 blir tom. + varianter av vissa av dessa med fler parametrar EDA623 (Föreläsning 10) HT 2013 21 / 33

Avbildningar och mängder Associativa containers Tabeller med söknycklar t.ex. telefonlista med 2 kolumner (namn, telnr) där namnet utgör söknyckel Implementering i form av standardklasser map nyckel,värde Varje nyckel förekommer precis en gång multimap nyckel,värde Varje nyckel kan förekomma mer än en gång set nyckel Varje nyckel förekommer precis en gång multiset nyckel Varje nyckel kan förekomma mer än en gång EDA623 (Föreläsning 10) HT 2013 22 / 33

Avbildningar och mängder Direktiv för klasserna map och multimap #include <map> Exempel: Nummerlogger med <telnr, antal_ggr> map<string, int> numlog; numlog.insert(make_pair(string("046-112233"), 3)); numlog.insert(make_pair(string("042-123456"), 2)); numlog.insert(make_pair(string("0413-987654"), 3)); numlog.insert(make_pair(string("042-123456"), 4)); // Sista raden ger ingen uppdatering, ty upprepning. // Vid multimap hade däremot raden lagts till tabellen // (troligen hade multimap varit ett bättre alternativ här) cout << numlog.size() << endl; EDA623 (Föreläsning 10) HT 2013 23 / 33

Avbildningar och mängder Operationer för map och multimap m<ktyp, vtyp, ctyp> m<ktyp, vtyp> mtyp x; mtyp x(c); Anger tabelltyp (mtyp) med nyckeltyp ktyp, värdetyp vtyp jämförartyp ctyp (funktionsobjekt) Som ovan men ctyp blir less<ktyp> Skapar tom tabell. Söknycklar jämförs med ctyp() Skapar tom tabell. Söknycklar jämförs med c x.insert(p); Lägger in paret p. x[key] = value; Lägger in paret <key, value>. Ytterligare operationer find, count, erase, clear, size, empty, lower_bound, upper_bound, equal_range EDA623 (Föreläsning 10) HT 2013 24 / 33

Avbildningar och mängder Operationer för set och multiset s<etyp, ctyp> Anger mängdtyp (styp) med jämförartyp ctyp (funktionsobjekt) s<etyp> Anger mängdtyp (styp) med jämförartyp ctyp = less<etyp> styp x; Skapar tom mängd. Elementen jämförs med ctyp() styp x(c); Skapar tom mängd. Elementen jämförs med c x.insert(p); Lägger in värdet v av typen etyp i x. Ytterligare operationer find, count, erase, clear, size, empty, lower_bound, upper_bound, equal_range EDA623 (Föreläsning 10) HT 2013 25 / 33

Avbildningar och mängder Exempel med mängder int a[] = {3, 8, 2, 0, 9, 6, 3, 4, 5}; set<int> s1(a, a+4); // s1 innehåller {0, 2, 3, 8} set<int> s2(a+3, a+6); // s2 innehåller {0, 6, 9} s2.insert(1); s2.insert(3); // s2 innehåller {0, 1, 3, 6, 9} copy(s1.begin(),s1.end(),inserter(s2,s2.begin())); // s2 innehåller {0, 1, 2, 3, 6, 8, 9} set<int> s3(a+5, a+9); // s3 innehåller {3, 4, 5, 6} set_intersection(s2.begin(),s2.end(),s3.begin(), s3.end(),inserter(s1, s1.begin())); // s1 innehåller {0, 2, 3, 6, 8} EDA623 (Föreläsning 10) HT 2013 26 / 33

Köer och stackar Förenklade standardklasser, s.k. adapterklasser, implementerade med hjälp av någon av de andra standardklasserna: stack, queue Enklare gränssnitt med färre operationer Kan inte använda iteratorer EDA623 (Föreläsning 10) HT 2013 27 / 33

Köer och stackar Stack: LIFO-struktur (Last In First Out) Operationer: push, pop, top, size och empty EDA623 (Föreläsning 10) HT 2013 28 / 33

Köer och stackar Kö: FIFO-struktur (First In First Out) Operationer: push, pop, front, back, size och empty EDA623 (Föreläsning 10) HT 2013 29 / 33

Köer och stackar Prioritetskö: Som kö fast elementen har prioritet. Elementet med högst prioritet ligger först i kön. Operationer: push, pop, top, size och empty EDA623 (Föreläsning 10) HT 2013 30 / 33

Köer och stackar Exempel: Använda stack för baklängesutskrift #include <stack> #include <iostream> using namespace std; int main () { stack<char> s; char c; cout << "Skriv in text och avsluta med <CR>"; while ((c = cin.get())!= \n ) s.push(c); while (!s.empty()) { cout << s.top(); s.pop(); } } EDA623 (Föreläsning 10) HT 2013 31 / 33

Köer och stackar Exempel: Lägga in heltal i kö och skriva ut dem #include <queue> #include <iostream> using namespace std; int main () { queue<int> q; int i; cout << "Skriv in tal och avsluta med Ctrl-Z" << endl; while (cin >> i) q.push(i); while (!q.empty()) { cout << q.front() << ; q.pop(); } } EDA623 (Föreläsning 10) HT 2013 32 / 33

Köer och stackar Exempel: Skriva ut tal i storleksordning #include <queue> #include <iostream> #include <utility> using namespace std; int main () { priority_queue<int> p; int i; cout << "Skriv in tal och avsluta med Ctrl-Z" << endl; while (cin >> i) p.push(i); while (!p.empty()) { cout << p.top() << ; p.pop(); } } EDA623 (Föreläsning 10) HT 2013 33 / 33