STL:n uudistukset Seppo Koivisto TTY Ohjelmistotekniikka 2012-05-04
Sisältö 1 Muutokset säiliöihin ja uudet säiliötyypit 2 3 4 5
STL:n säiliöt Viitteet ja osoittimet ovat muuttuneet: Allocator::reference value_type& T* std::allocator_traits <Allocator>::pointer Vastaavasti myös vakioviitteet ja vakio-osoittimet avainsanalla const Vakioiteraattorit, pl. stack, queue ja priority_queue
Uudet rajapintafunktiot Säiliö Vector Deque List shrink_to_fit X X emplace X X X emplace_back X X X emplace_front X X Taulukko 1: Sarjasäiliöiden uudet rajapintafunktiot Säiliöillä stack, queue ja priority_queue on em. funktioista vain emplace.
Uudet rajapintafunktiot Kaikille vanhoille assosiatiivisäiliöille on lisätty rajapintafunktiot emplace ja emplace_hint. Rajapintafunktio emplace rakentaa lisättävän elementin paikallaan, eli sitä ei kopioida, eikä siirretä. Sarjasäiliöiden emplace_back ja emplace_front laittavat alkion säiliön loppuun tai alkuun (vrt. push_back ja push_front) Assosiatiivisäiliöiden emplace_hint ottaa parametrikseen vielä lisäksi iteraattorin, joka vihjaa mihin alkio tulisi laittaa.
Uudet säiliötyypit Uusina säiliöinä STL:ään on toteutettu array forward_list unordered_set ja unordered_multiset unordered_map ja unordered_multimap Lisäksi on vielä tuple (utilities kirjastosta), mutta siitä ei sen enempää tässä.
array Array on käytännössä C-taulukon päälle luotu kuori. Jäsenfunktiot ovat vakioaikaisia, paitsi fill ja swap, jotka ovat lineaarisia. template < c l a s s T, // Tyyppi s i z e _ t N // Koko > s t r u c t a r r a y ;
array Indeksointi jäsenfunktiolla at() tai []-operaatiolla Funktioilla front ja back voidaan käsitellä ensimmäistä ja viimeistä alkiota Funktion data() avulla päästään suoraan käsiksi sisällä olevaan taulukkoon. Tarjoaa iteraattorit, myös käänteis- Kapasiteettiin liittyviä operaatioita ovat empty(), size() ja max_size()
forward_list Säiliöön lisääminen ja poistaminen on nopeaa mihin tahansa kohtaan On toteutettu yhteen suuntaan linkitettynä listana template < c l a s s T, c l a s s A l l o c a t o r = s t d : : a l l o c a t o r <T> > c l a s s f o r w a r d _ l i s t ;
unordered_set ja unordered_multiset Assosiatiivinen säiliö, joka sisältää joukon uniikkeja Key-tyyppisiä olioita. Multiset voi sisältää samojakin olioita. Haku, lisäys ja poisto ovat keskimäärin vakioaikaisia operaatioita. Vrt. set ja multiset logaritmisia. Eroavat set ja multiset säiliöistä siten, että alkiot eivät ole järjestyksessä. Esimerkki
unordered_map ja unordered_multimap Assosiatiivinen säiliö, joka sisältää joukon avain-arvo -pareja, joilla avain on uniikki. Multimap voi sisältää samojakin olioita. Haku, lisäys ja poisto ovat keskimäärin vakioaikaisia operaatioita. Vrt. map ja multimap logaritmisia. Eroavat map ja multimap säiliöistä siten, että alkiot eivät ole järjestyksessä.
Algoritmit Algoritmit on jaoteltu 10 luokkaan: Non-modifying sequence operations Modifying sequence operations Partitioning operations Sorting operations (on sorted ranges) Binary search operations (on sorted ranges) (ei muutoksia) Set operations (on sorted ranges) (ei muutoksia) Heap operations Minimum/maximum operations Numeric operations ja C library (ei muutoksia)
Ei-muokkaavat sarjaoperaatiot all_of, any_of, none_of, find_if_not Esimerkkinä all_of, loput suunilleen samannäköisiä template < c l a s s I n p u t I t e r a t o r, c l a s s U n a r y P r e d i c a t e > b o o l a l l _ o f ( I n p u t I t e r a t o r f i r s t, I n p u t I t e r a t o r l a s t, U n a r y P r e d i c a t e p ) { f o r ( ; f i r s t!= l a s t ; ++f i r s t ) { i f (! p ( f i r s t ) ) r e t u r n f a l s e ; } r e t u r n t r u e ; }
Muokkaavat sarjaoperaatiot copy_if, copy_n, move, move_backward, random_shuffle, shuffle random_shuffle oli ennenkin, mutta nyt on muutettu yhtä parametria: RandomNumberGenerator& r RandomNumberGenerator&& r
Partitiointioperaatiot is_partitioned ja partition_point Ensimmäinen tarkistaa onko annettu väli partitoitu ja toinen selvittää partitiointikohdan ja palauttaa iteraattorin template < c l a s s I n p u t I t e r a t o r, c l a s s U n a r y P r e d i c a t e > b o o l i s _ p a r t i t i o n e d ( I n p u t I t e r a t o r f i r s t, I n p u t I t e r a t o r l a s t, U n a r y P r e d i c a t e p ) { f o r ( ; f i r s t!= l a s t ; ++f i r s t ) i f (! p ( f i r s t ) ) b r e a k ; f o r ( ; f i r s t!= l a s t ; ++f i r s t ) i f ( p ( f i r s t ) ) r e t u r n f a l s e ; r e t u r n t r u e ; }
Lajitteluun liittyvät operaatiot is_sorted ja is_sorted_until Ensimmäinen tarkistaa onko annettu väli lajiteltu pienin ensin -järjestykseen ( < -operaattorin mukaan) Mahdollista käyttää omaa vertailijaa Toinen etsii suurimman järjestyksessä olevan välin aloittaen alusta, paluuarvona iteraattori viimeiseen järjestyksessä olevaan alkioon
Keko-operaatiot Uutena is_heap_until Kuten edellä mainittu is_sorted_until
Minimi- ja maksimioperaatiot minmax - palauttaa suurimman ja pienimmän kahdesta, tai useammasta Käyttää vertailijaa comp tai < -operaattoria Parametriksi voidaan antaa myös initializer_list minmax_element, kuten minmax, mutta palauttaa elementit arvojen sijaan is_permutation, palauttaa tosi jos on olemassa sellainen permutaatio elementtien [f, l) välillä, joka vastaa d:stä alkavaa joukkoa
Numeeriset operaatiot iota, alustaa annetun välin aloittaen annetusta arvosta ja kasvattaen sitä ++-operaattorin mukaisesti http://en.cppreference.com/w/cpp/ algorithm/iota
Lambdat Eniten lambdoista hyötyvät STL:n algoritmien tehokäyttäjät. Lambdojen avulla algoritmeja voi käyttää lähes samalla tavalla kuin kirjoittaisi normaalin silmukan. Esimerkki.
Esimerkki for_each ( v. b e g i n ( ), v. end ( ), [ ] ( i n t v a l ) { cout << v a l << e n d l ; } ) ;
Kasuaarit Kuuluvat strutsilintujen lahkoon ainoana sukuna Elävät Australiassa ja sen lähisaaristossa Luokiteltu maailman vaarallisimmaksi linnuksi Ovat luonteeltaan agressiivisia
Perusopetus (ohj1, 2)? Oliokurssit Tiraka
http://www.cplusplus.com/reference/stl http://en.cppreference.com/w/cpp http://www.cprogramming.com/c++11/c+ +11-lambda-closures.html C++11 standardi Wikipedia