Intro till standardbiblioteket Eric Elfving
1 Behållare (containers) 2 Iteratorer 3 Algoritmer
15 mars 2018 2 / 13 Bibliotekets behållare delas in i tre grupper: Sekevensbehålare (Sequence containers) Lagrar värden i en given sekvens. Kan vanligen använda index för att komma åt värden (dock ej garanterat). Sekvensadaptrar (Sequence adaptors) Anpassar gränssnittet för en given sekvensadapter. Associativa (Associative) Lagrar värden associerade till givna nycklar (istället för index).
15 mars 2018 3 / 13 Sekvensbehållare vector Lagrar värden kontinuerligt (i minnet). Kan ändra storlek vid behov (innebär ibland omallokering). array Fungerar som vector, men har en fast (vid kompilering) storlek. deque Double-ended queue, Bra när man ska lagra värden i börjar OCH i slutet. list Dubbellänkad lista. forward_list Enkellänkad lista.
15 mars 2018 4 / 13 Sekvensadaptrar stack Bygger ofta på deque, du kan endast komma åt det senast inlagda värdet. queue FIFO (First-In First-Out) kö. Du stoppar in värden i slutet och tar ut dem i början. priority_queue En kö som ordnar värden efter någon given prioritering.
15 mars 2018 5 / 13 Associativa map Kopplar ett värde till en nyckel av given typ. map<string, int> använder en string som nyckel för att komma åt ett värde av typ int. set Liknar map, men vi använder endast nyckeln (bra för att få unika värden). Finns även i multi- och unordered-varianter.
1 Behållare (containers) 2 Iteratorer 3 Algoritmer
15 mars 2018 7 / 13 En iterator är ett gemensamt gränssnitt för att referera till ett värde, ofta som ägs av en given behållare. Behållaren tillhandahåller en iterator specialiserad för att traversera just den datastrukturen behållaren består av. Gränssnittet ser ut som de inbyggda pekarna.
15 mars 2018 8 / 13 Det finns fem olika kategorier av iteratorer. Kategorin bestäms av behållaren och beror på den underliggande datastrukturen. Nedanstående tabell visar på vad som går att göra med respektive iterator. Kategori Operationer Input Output Forward Bidirectional Random Access ==,!= *, -> Läsa Skriva Läsa/Skriva Läsa/Skriva Läsa/Skriva ++ -- - - - +, +=, -, -= - - - - <, <=, >, >= - - - - i[n] - - - -
15 mars 2018 9 / 13 Om iteratorns kategori är bidirectional eller random access har vi även tillgång till reverse-iteratorer för att iterera genom behållaren baklänges. Figur : Förhållandet mellan iteratorn och dess reverse-variant cppreference
vector<int> values {1, 2, 3, 5, 8}; // explicitly declaring an iterator vector<int>::iterator it { values.begin() }; *it = 5; // change first element (1) to 5 // iterate over range using iterators for ( auto it { begin(values) }; it!= end(values); ++it ) { cout << *it << endl; } 15 mars 2018 10 / 13
1 Behållare (containers) 2 Iteratorer 3 Algoritmer
15 mars 2018 12 / 13 Standardbiblioteket har en stor samling av generella, effektiva lösningar av vanliga problem. Vi använder iteratorer för att bestämma intervall av värden att göra beräkningar på. Simple example: vector<int> vals {1, 2, 5, 2, 7}; sort(begin(vals), end(vals)); // vals is in order 1 2 2 5 7 Algoritmen bestämmer vilka iterator-kategorier som stöds. Vissa behållare har medlemsfunktioner som används istället för den generella algoritmen: list<int> lst {1, 45, 2, 5}; lst.sort();
15 mars 2018 13 / 13 Det inbyggda beteendet kan förändras med något som kan anropas som en funktion. bool comp(int a, int b) { return b < a; } vector<int> v {1, 2, 4, 2, 7}; Funktionspekare sort(begin(v), end(v), comp);
15 mars 2018 13 / 13 Det inbyggda beteendet kan förändras med något som kan anropas som en funktion. bool comp(int a, int b) { return b < a; } vector<int> v {1, 2, 4, 2, 7}; Funktionspekare sort(begin(v), end(v), comp); Funktionsobjekt (klasstyp som överlagrar funktionsanropsoperatorn) sort(begin(v), end(v), std::greater<int>{});
15 mars 2018 13 / 13 Det inbyggda beteendet kan förändras med något som kan anropas som en funktion. bool comp(int a, int b) { return b < a; } vector<int> v {1, 2, 4, 2, 7}; Funktionspekare sort(begin(v), end(v), comp); Funktionsobjekt (klasstyp som överlagrar funktionsanropsoperatorn) sort(begin(v), end(v), std::greater<int>{}); Lambdauttryck - temporärt anonymt funktionsobjekt sort(begin(v), end(v), [](int l, int r) { return r < l; });
Eric Elfving www.liu.se