Innehåll. Klasserna vector och deque

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

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

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.

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

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

Intro till standardbiblioteket. Eric Elfving

Standard Template Library STL. Behållarklasser

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

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

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

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

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

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

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

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

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

Tentamen EDAF30 Programmering i C++

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

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

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

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

Tommy Färnqvist, IDA, Linköpings universitet

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

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

TDIU01 - Programmering i C++, grundkurs

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

TDIU01 - Programmering i C++, grundkurs

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Tentamen EDAF30 Programmering i C++

Tentamen *:85/2I4123 C

Skizz till en enkel databas

Inlämningsuppgift, EDAF30, 2016

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

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

Inlämningsuppgift, EDAF30, 2018

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

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

TDIU01 - Programmering i C++, grundkurs

Grundläggande programmering med C# 7,5 högskolepoäng

Tentamen EDAF30 Programmering i C++

Introduktion till arv

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

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

TDIU01 Programmering i C++

maxlist-1. Indexerad lista Länkad lista

TDIU01 - Programmering i C++, grundkurs

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Objektorienterad programmering D2

DD2387 Programsystemkonstruktion med C++ Tentamen 2

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

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

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

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

TDIU01 - Programmering i C++, grundkurs

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Tentamen i Objektorienterad programmering

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

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

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

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

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

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

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

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

Tentamen OOP

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

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

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

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

Föreläsning Datastrukturer (DAT036)

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Föreläsning 10. ADT:er och datastrukturer

Föreläsning 6: Introduktion av listor

Tentamen EDAF30 Programmering i C++

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

Länkade strukturer. (del 2)

Tentamen C++-programmering

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Kap 6: Lista, stack och kö

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

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

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

TDDC76 - Programmering och Datastrukturer

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

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

Tentamen EDAF30 Programmering i C++

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

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

OOP Objekt-orienterad programmering

Övningar Dag 2 En första klass

Tentamen i DD2387 Programsystemkonstruktion med C++

7 Templates och Exceptions

TDDC76 - Programmering och Datastrukturer

Föreläsning 4 Innehåll

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

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

Transkript:

Innehåll EDAF30 Programmering i C++ Standardbiblioteket: Datastrukturer och algoritmer Sven Gestegård Robertz Datavetenskap, LTH 2015 1 Datastrukturer, containerklasser Sekvenser Insättning 2 Insättningsiteratorer Funktionsobjekt 3 Mer datastrukturer Listor Adapterklasser: Standardbiblioteket: Datastrukturer och algoritmer 2/1 Containerklasser Klassificering Sekvenser vector<t> deque<t> list<t> adapterklasser (begränsade versioner av ovanstående) queue<t, Sequence> priority_queue<t, Sequence> stack<t, Sequence> Associativa containers (finns även unordered) map<k,v>, multimap<k,v> 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 > set<t>, multiset<t> Datastrukturer, containerklasser Standardbiblioteket: Datastrukturer och algoritmer 3/44 Datastrukturer, containerklasser : Sekvenser Standardbiblioteket: Datastrukturer och algoritmer 4/44 Typen av element anges som template-parameter (inom <>) 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 (), v. insert (), v. emplace () v. resize (), v. reserve () Ytterligare operationer i klassen deque d. push_front (), d. pop_front () Default-konstruktor vector <double > vd1; // vektor med flyttal (0 element ) vector <int > vi1; // vektor med heltal (0 element ) Konstruktorer: (storlek), (storlek,elementvärde) och {... vector <int > vi2 (5); // vektorn {0, 0, 0, 0, 0 vector <double > vd2 (2,1.2); // vektorn {1.2, 1.2 vector <double > vd3 {2,1.2; // vektorn {2, 1.2 Kopiering (konstruktor och tilldelning) och storlek 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 Datastrukturer, containerklasser : Sekvenser Standardbiblioteket: Datastrukturer och algoritmer 5/44 Datastrukturer, containerklasser : Sekvenser Standardbiblioteket: Datastrukturer och algoritmer 6/44

Medlemsfunktioner push och pop Medlemsfunktioner push och pop push lägger till ett element, storleken ökar pop tar bort ett element, storleken minskar *_back opererar på slutet, finns i båda void push_back (const value_type & val ); // copy void push_back ( value_type && val ); // move (C ++11) void pop_back (); bara i deque: *_front void push_front (const value_type & val ); // copy void push_front ( value_type && val ); // move (C ++11) Exempel vector <int > v{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 void pop_front (); Datastrukturer, containerklasser : Sekvenser Standardbiblioteket: Datastrukturer och algoritmer 7/44 Datastrukturer, containerklasser : Sekvenser Standardbiblioteket: Datastrukturer och algoritmer 8/44 Medlemsfunktionen assign Medlemsfunktionen assign, exempel Tre varianter: fill: n stycken element med samma värde void assign ( size_type n, const value_type & val ); initializer list void assign ( initializer_list <value_type > il ); range: kopierar från first till last (exkl last, [first, last) ) template <class InputIterator > void assign ( InputIterator first, InputIterator last ); vector <int > v; int a[]{0,1,2,3,4,5,6,7,8,9; v. assign (3,1); v. assign ({11,13,15,17); length = 4: [11][13][15][17] v. assign (a, a+4 ); std :: deque <int > d; d. assign (v. begin (), v.end () ); print_seq (d); length = 3: [1][1][1] length = 4: [0][1][2][3] length = 4: [0][1][2][3] Exempel på iteratorer Datastrukturer, containerklasser : Sekvenser Standardbiblioteket: Datastrukturer och algoritmer 9/44 Datastrukturer, containerklasser : Sekvenser Standardbiblioteket: Datastrukturer och algoritmer 10/44 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; Kategorier av iteratorer: Input Iterator (++ ==!= ) (defererens som rvalue: *a, a->) Output Iterator (++ ==!= ) (defererens som lvalue: *a=t) Forward Iterator (++) Bidirectional Iterator (++, --) Random-access Iterator (+=, -=, a[n], <, <=, >, >=) Olika iteratorer för en containertyp (con symboliserar någon av containertyperna vektor, deque eller list med elementtypen T) con<t>::iterator con<t>::const_iterator con<t>::reverse_iterator con<t>::const_reverse_iterator 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 Datastrukturer, containerklasser : Standardbiblioteket: Datastrukturer och algoritmer 11/44 Datastrukturer, containerklasser : Standardbiblioteket: Datastrukturer och algoritmer 12/44

Funktioner som returnerar iteratorer och som finns i alla containerklasser + klassen string begin() end() rbegin() rend() samt: 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 cbegin () rcbegin () cend () rcend () 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 Datastrukturer, containerklasser : Standardbiblioteket: Datastrukturer och algoritmer 13/44 Datastrukturer, containerklasser : Standardbiblioteket: Datastrukturer och algoritmer 14/44 Exempel: vector::assign, vector::insert och vector::erase Insättning med insert och emplace insert: kopiering int a[] {1,2,3,4; vector <int > v; v. assign (a, a +4); length = 4: [1][2][3][4] v. insert (v.begin ()+2, 3, 9); length = 7: [1][2][9][9][9][3][4] v. erase (v. begin ()+5); length = 6: [1][2][9][9][9][4] v. erase (v. begin (),v. begin ()+2); length = 4: [9][9][9][4] iterator insert ( const_iterator pos, const value_type & val ); iterator insert ( const_iterator pos, size_type n, const value_type & val ); template <class InputIterator > iterator insert ( const_iterator pos, InputIterator first, InputIterator last ); iterator insert ( const_iterator pos, initializer_list <value_type > il ); emplace: konstruering in-place template <class... Args > iterator emplace ( const_iterator position, Args &&... args ); template <class... Args > void emplace_back ( Args &&... args ); Datastrukturer, containerklasser : Standardbiblioteket: Datastrukturer och algoritmer 15/44 Datastrukturer, containerklasser : Insättning Standardbiblioteket: Datastrukturer och algoritmer 16/44 Exempel med insert och emplace struct Foo { int x; int y; Foo (int a=0,int b=0) :x{a,y{b {cout <<* this <<")\n"; Foo (const Foo & f) :x{f.x,y{f.y {cout <<"** Copying Foo \n"; ; std :: ostream & operator <<(std :: ostream & os, const Foo& f) { return os << " Foo (" << f.x << "," <<f.y<<")"; vector <Foo > v; v. reserve (4); v. insert (v.begin (), Foo (17,42)); length = 1: [ Foo (17,42)] v. insert (v.end (), Foo (7,2)); Foo (17,42)) ** Copying Foo Foo (7,2)) ** Copying Foo length = 2: [Foo (17,42)][ Foo (7,2)] v. emplace_back (); Foo (0,0)) length = 3: [Foo (17,42)][ Foo (7,2)][ Foo (0,0)] v. emplace_back (10); Foo (10,0)) length = 4: [Foo (17,42)][ Foo (7,2)][ Foo (0,0)][ Foo (10,0)] Datastrukturer, containerklasser : Insättning Standardbiblioteket: Datastrukturer och algoritmer 17/44 Tillgång till standardalgoritmer i C++ fås med direktivet # include <algorithm > Numeriska algoritmer: # include <numeric >> Ett 30-sidigt appendix (App C) i boken ger detaljer om varje algoritm Standardbiblioteket: Datastrukturer och algoritmer 18/44

Exempel: copy 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 template <class InputIterator, class OutputIterator > OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result ); Exempel: vector <int > a(8,1); print_seq (a); int b[]{5,4,3,2; length = 8: [1][1][1][1][1][1][1][1] std :: copy (std :: begin (b), std :: end(b), a.begin ()+2); print_seq (a); length = 8: [1][1][5][4][3][2][1][1] Standardbiblioteket: Datastrukturer och algoritmer 19/44 Standardbiblioteket: Datastrukturer och algoritmer 20/44 Exempel: find Exempel: find_if template <class InputIterator, class T> InputIterator find ( InputIterator first, InputIterator last, const T& val ); Exempel: vector < std :: string > s{" Kalle ", " Pelle ", " Lisa ", " Kim "; auto it = std :: find (s. begin (), s. end (), " Pelle "); if(it!= s. end ()) cout << " Hittade " << *it << endl ; else cout << " Mislyckades "<< endl ; Hittade Pelle template <class InputIterator, class UnaryPredicate > InputIterator find_if ( InputIterator first, InputIterator last, UnaryPredicate pred ); Exempel: bool is_odd ( int i) { return i % 2 == 1; void test_find_if () { vector <int > v{2,4,6,5,3; auto it = std :: find_if (v.begin (), v.end (), is_odd ); if(it!= v.end ()) cout << " Hittade " << *it << endl ; else cout << " Mislyckades "<< endl ; Hittade 5 Standardbiblioteket: Datastrukturer och algoritmer 21/44 Standardbiblioteket: Datastrukturer och algoritmer 22/44 Insättningsiteratorer <iterator> Funktionsobjekt och transform Exempel: vector <int > v{1, 2, 3, 4; vector <int > e; std :: copy (v.begin (), v.end (), std :: back_inserter (e )); print_seq (e); length = 4: [1][2][3][4] deque <int > e2; std :: copy (v.begin (), v.end (), std :: front_inserter (e2 )); print_seq (e2 ); length = 4: [4][3][2][1] vector <int > e3; std :: copy (v.begin (), v.end (), std :: inserter (e3, e3.begin ())); print_seq (e3 ); length = 4: [1][2][3][4] vector <int > e4 (2,11); auto it =e4. begin ()+1; std :: copy (v. crbegin (), v.crend (), std :: inserter (e4, it )); print_seq (e4 ); length = 6: [11][4][3][2][1][11] : Insättningsiteratorer Standardbiblioteket: Datastrukturer och algoritmer 23/44 Funktionsobjekt är objekt som kan anropas som funktioner. Algoritmen transform (från Kat. 5 i App C) kan hantera både funktionspekare och funktionsobjekt. template < class InputIt, class OutputIt, class UnaryOperation > OutputIt transform ( InputIt first, InputIt last, OutputIt d_first, UnaryOperation unary_op ); template < class InputIt1, class InputIt2, class OutputIt, class BinaryOperation > OutputIt transform ( InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op ); : Funktionsobjekt Standardbiblioteket: Datastrukturer och algoritmer 24/44

Funktionsobjekt och transform Funktionsobjekt Exempel med funktionspekare int kvad (int x) { return x*x; vector <int > 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 Ett funktionsobjekt är ett objekt från en klass som har överlagrat funktionsanropsoperatorn () Föregående exempel med funktionsobjekt struct { int operator () ( int x) const { return x*x; sq; vector <int > v{1, 2, 3, 5, 8; vector <int > ww; // ww är också tom! transform (v. begin (), v.end (), inserter (ww, ww. begin ()), sq ); // ww = {1, 4, 9, 25, 64 : Funktionsobjekt Standardbiblioteket: Datastrukturer och algoritmer 25/44 : Funktionsobjekt Standardbiblioteket: Datastrukturer och algoritmer 26/44 Funktionsobjekt Fördefinierade funktionsobjekt: <functional> Funktionsobjekt Exempel: std::plus ur <functional> Funktioner: plus, minus, multiplies, divides, modulus, negate, equal_to, not_equal_to, greater, less, greater_equal, less_equal, logical_and, logical_or, logical_not Fördefinierat funktionsobjekt skapas med operation <typ >() t ex auto f = std :: plus <int >(); transform med binär funktion vector <int > v1 {1,2,3,4,5; vector <int > v2 (10,10); vector <int > res2 ; auto it = std :: inserter (res2, res2.begin ()); auto f = std :: plus <int >(); std :: transform (v1.begin (), v1.end (), v2.begin (), it, f); print_seq ( res2 ); length = 5: [11][12][13][14][15] : Funktionsobjekt Standardbiblioteket: Datastrukturer och algoritmer 27/44 : Funktionsobjekt Standardbiblioteket: Datastrukturer och algoritmer 28/44 Standardklassen list Standardklassen list Liksom vector och deque utgör list en implementering av sekvenser Intern representation är en s.k. länkad lista (och inte en array som i fallen vector och deque) list <int > l; l. push_back (4); l. push_back (5); l. push_back (2); 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 Mer datastrukturer : Listor Standardbiblioteket: Datastrukturer och algoritmer 29/44 Mer datastrukturer : Listor Standardbiblioteket: Datastrukturer och algoritmer 30/44

<map>: std::map 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> multimap<nyckel,värde> set<nyckel> multiset<nyckel> Varje nyckel förekommer precis en gång En nyckel kan förekomma mer än en gång Varje nyckel förekommer precis en gång En nyckel kan förekomma mer än en gång map <string, int > msi; msi. insert ( make_pair ("Kalle ", 1)); msi. emplace ("Lisa ", 2); msi["kim"]= 5; for ( auto & a: msi) { cout << a.first << " : " << a. second << endl ; cout << msi.at(" Lisa ") << endl ; cout << msi.at("kim") << endl ; Kalle : 1 Kim : 5 Lisa : 2 2 5 Mer datastrukturer : Standardbiblioteket: Datastrukturer och algoritmer 31/44 Mer datastrukturer : Standardbiblioteket: Datastrukturer och algoritmer 32/44 <map>: <std::multimap> <map>: map och <multimap> multimap <string, int > mmsi ; mmsi. insert ( make_pair ("Kalle ", 1)); mmsi. emplace ("Lisa ", 2); mmsi. insert ( make_pair ("Kim ", 5)); mmsi. emplace ("Kalle ", 27); mmsi. emplace ("Kim ", 18); for ( auto & a: mmsi ) { cout << a.first << " : " << a. second << endl ; cout << " -- find :\n"; for ( auto it1 = mmsi. find (" Kim "); it1!=mmsi. end () && it1 ->first=="kim "; ++it1 ) { cout << it1 ->first << " : " << it1 ->second << endl ; auto kalles = mmsi. equal_range ("Kalle "); for ( auto it = kalles. first ; it!= kalles. second ; ++ it) { cout << it -> first << " : " << it -> second << endl ; Kalle : 1 Kalle : 27 Kim : 5 Kim : 18 Lisa : 2 -- find : Kim : 5 Kim : 18 Kalle : 1 Kalle : 27 Mer datastrukturer : Standardbiblioteket: Datastrukturer och algoritmer 33/44 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 ; Mer datastrukturer : Standardbiblioteket: Datastrukturer och algoritmer 34/44 std::set: i princip en std::map med endast nycklar Parametrar för std::map och std::multimap template < class Key, // map :: key_type class T, // map :: mapped_type class Compare = less <Key >, // map :: key_compare class Alloc = allocator <pair <const Key,T> > > class map ; och multimap analogt Operationer insert, emplace, [], at, find, count, erase, clear, size, empty, lower_bound, upper_bound, equal_range Parametrar för std::set och std::multiset template < class T, // set :: key_type class Compare = less <T>, // set :: key_compare class Alloc = allocator <T> // set :: allocator_type > class set; och multiset analogt Operationer insert, find, count, erase, clear, size, empty, lower_bound, upper_bound, equal_range Mer datastrukturer : Standardbiblioteket: Datastrukturer och algoritmer 35/44 Mer datastrukturer : Standardbiblioteket: Datastrukturer och algoritmer 36/44

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 Stack: LIFO-struktur (Last In First Out) Operationer: push, pop, top, size och empty Mer datastrukturer : Adapterklasser: Standardbiblioteket: Datastrukturer och algoritmer 37/44 Mer datastrukturer : Adapterklasser: Standardbiblioteket: Datastrukturer och algoritmer 38/44 Kö: FIFO-struktur (First In First Out) Operationer: push, pop, front, back, size och empty 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 Mer datastrukturer : Adapterklasser: Standardbiblioteket: Datastrukturer och algoritmer 39/44 Mer datastrukturer : Adapterklasser: Standardbiblioteket: Datastrukturer och algoritmer 40/44 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 (); 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 (); Mer datastrukturer : Adapterklasser: Standardbiblioteket: Datastrukturer och algoritmer 41/44 Mer datastrukturer : Adapterklasser: Standardbiblioteket: Datastrukturer och algoritmer 42/44

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 (); Vi har talat om Datastrukturer Nästa föreläsning: Vi kommer att studera länkade strukturer Listor Träd Mer datastrukturer : Adapterklasser: Standardbiblioteket: Datastrukturer och algoritmer 43/44 Mer datastrukturer : Adapterklasser: Standardbiblioteket: Datastrukturer och algoritmer 44/44