Title: STL%20-%20Standard%20Template%20Library%202%20(STL%20od%20zr
1STL - Standard Template Library 2(STL od zródel,
czyli specyfikacja biblioteki)
- Autor Blazej Chodarcewicz
- rainbow.mimuw.edu.pl/bc189380/STL/
2Standard C (STL)
- Organizacja pracujaca nad standardem
http//anubis.dkuug.dk/jtc1/sc22/wg21/ - Wersja Draft 1996 r.
- ISO-IEC 14882 Programming.Language.C (1998)
- ISO/IEC 148822003
3Jak to dziala?
4Iteratory
- Uogólnienie wstazników
- Umozliwiaja prace z kontenerami w ujednolicony
sposób - Biblioteka formalizuje interfejs, semantyke oraz
zalozenia zlozonosciowe - Semantyka iteratorów jest uogólnieniem semantyki
wskazników - Wyrazenie i wartoscia jest obiekt pewnej
klasy, enumeracja lub typ wbudowany T, zwany
value type of iterator - Wszystkie iteratory i, dla których (i).m jest
zdefiniowane, wspieraja takze wyrazenie i-gtm - Dla kazdego iteratora typu X, dla którego
zdefiniowana jest równosc, jest dostepny typ
difference type iteratora
5Rodzaje iteratorów
- input iterators
- output iterators
- forward iterators
- bidirectional iterators
- random access iterators
6Relacje pomiedzy iteratorami
Input
Output
Forward
Bidirectional
Random Access
7Iteratory zmienialne i niezmienialne
- mutable, constant iterators
- i jako referencja lub referencja do stalej
- Iteratory stale nie spelniaja wymagan output
iterators
8past-the-end value
- Dla kazdego iteratora istnieje wartosc wskazujaca
na element za ostatnim elementem kolekcji, z
która zwiazany jest iterator - dereferencable values
- Biblioteka nigdy nie zaklada, ze past-the-end
value jest dereferencable
9Kilka definicji
- Iterator i jest reachable z iteratora i wtw., gdy
istnieje skonczona sekwencja aplikacji wyrazenia
i, po której mamy i j. - Jesli i jest reachable z j, to i i j odnosza sie
do tej samej kolekcji - Range para iteratorów, które okreslaja poczatek
i koniec obliczen - Range i, i) empty range
- W ogólnosci range i, j) odnosi sie do elementów
struktury danych zaczynajacych sie od elementu
wskazywanego przez i, konczacych sie na elemencie
wskazywanym przez j bez tego elementu - Range i, j) jest prawidlowe wtw., gdy j jest
reachable z i. Aplikacja algorytmu dla
nieprawidlowego Range jest nieokreslona
10Kilka zalozen
- Zlozonosc (zamortyzowana) wszystkich operacji
wymaganych dla danej kategorii iteratora jest
stala - Na nastepnych slajdach wystepuja
- a, b oznaczaja wartosci iteratora X, n oznacza
wartosc typu difference type Distance u, tmp i m
oznaczaja identyfikatory, r oznacza wartosc X, t
oznacza wartosc typu wartosci iteratora - T.
11Input iterator - wymagania
Operacja Typ Semantyka, zalozenia
X u(a) X post u jest kopia a Destruktor musi byc zdefiniowany i dostepny.
u a X wynik u post u jest kopia a
a b convertible to bool jest relacja równosci (w matematycznym sensie) zdefiniowana na dziedzinie wartosci iteratora
a ! b convertible to bool bool(ab) ! bool(a!b) dla dziedziny
a T pre a jest dereferenceable Jesli ab i (a,b) nalezy do dziedziny relacji , wtedy a jest takie samo jak b.
a-gtm pre (a).m jest dobrze zdefiniowane Semantyka jest taka sama jak (a).m
12Input iterator wymagania c.d.
Operacja Typ Semantyka, zalozenia
r X pre r jest dereferenceable post r jest dereferenceable lub r jest wartoscia past-the-end post kazda kopia poprzednij wartosci r nie musi juz byc ani dereferenceable, ani nawet nie musi byc w dziedzinie
(void)r taka sama jak (void)r
r T T tmp r r return tmp
13Input iterator uwagi
- a b nie implikuje a b
- Algorytmy nigdy nie powinny próbowac przechodzi
po tym samym iteratorze dwa razy - Typ wartosci T nie musi byc typem lvalue
(Przyklad istream_iterator)
14Output iterator - wymagania
Operacja Zwracany typ Semantyka, zalozenia
X(a) X a t jest takie samo jak X(a) t Zaklada sie obecnosc destruktora
X u(a) SGI pre a musi byc zainicjalizowane post a t jest takie samo jak u t
X u a SGI pre a musi byc zainicjalizowane post a t jest takie samo jak u t
a t nieuzywany SGI pre a jest dereferencable po poprzednim przypisaniu bylo wykonane zwiekszenie a
r X r r
r konwertowalny do const X X tmp r const X r return tmp
r t nieuzywany
15Output iterator - uwagi
- operator moze zostac uzyty jedynie po lewej
stronie wyrazenia przypisania - przypisanie poprzez wartosc iteratora odbywa sie
tylko raz - nigdy nie nalezy przechodzic po tych samych
wartosciach iteratora wiecej niz raz - i ! moga byc niezdefiniowane
16Forward iterator - wymagania
Operacja Typ Semantyka, zalozenia
X u u moze byc niezainicjowane, zakladane jest istnienie destruktora
X u(a) X u a X równowazne X u u a post u a
X(a) X X(a) a
a b convertible to bool jest relacja równosci (w matematycznym sensie) zdefiniowana na dziedzinie wartosci iteratora
a ! b convertible to bool !(ab)
r a X post r a
17Forward iterator wymagania c.d.
Operacja Typ Semantyka, zalozenia
a T pre a jest dereferenceable Jesli a b, to a b Jesli X jest typem mutowalnym, to a t jest poprawne
a-gtm pre (a).m jest dobrze zdefiniowane Semantyka jest taka sama jak (a).m
r X pre r jest dereferenceable post r jest dereferenceable lub r jest wartoscia past-the-end Jesli r s i r jest dereferencable, to r s. r r
r konwertowalny do const X X tmp r r return tmp
r T
18Bidirectional iterator dodatkowe wymagania
Operacja Typ Semantyka, zalozenia
--r X pre istnieje s takie, ze r s. post r jest dereferenceable. Jesli r --s, to r s. r --r. --(r) r.
r-- konwertowalny do const X X tmp r --r return tmp
r-- konwertowalny do T
19Random access iterator - wymagania
Operacja Typ Semantyka, zalozenia
r n X Distance m n if (m gt 0) while (m--) r else while (m) --r return r
a n n a X X tmp a return tmp n zalozenie a n n a
r - n X return r -n
a n X X tmp a return tmp - n
b a Distance pre Istnieje wartosc n typu Distance taka, ze a n b. b a (b a). (a lt b) ? distance(a, b) -distance(b, a).
20Random access iterator wymagania c.d.
Operacja Typ Semantyka, zalozenia
an konwertowalny do T (a n)
a lt b konwertowalny do bool true wtw., gdy b a gt 0. gt jest relacja porzadku liniowego.
a gt b konwertowalny do bool równowazne z b lt a. gt jest relacja porzadku liniowego
a lt b konwertowalny do bool takie samo jak !(a gt b)
a gt b konwertowalny do bool takie samo jak !(a lt b)
21Przyklady
int main() int array 1000, i int n 0
i array while (cin gtgt i) i i sort
(array, i) for (j array i ! j j) cout
ltlt j ltlt "\n"
22Przyklad
int main () vectorltintgt v int input
while (cin gtgt input) v.push_back
(input) sort(v.begin(), v.end()) for
(vectorltintgtiterator i v.begin() i !
v.end() i) cout ltlt i ltlt "\n"
23Obiekty funkcyjne
- Obiekty funkcyjne to obiekty, które maja
zdefiniowany operator () - Sa wazna czescia biblioteki STL, zapewniaja one
efektywnosc - Wszedzie tam, gdzie szablony algorytmów oczekuja
wskazników do funkcji, mozna stosowac obiekty
funkcyjne - Uzywanie obiektów funkcyjnych razem z szablonami
funkcji zwieksza sile wyrazu biblioteki, a takze
zwieksza efektywnosc kodu
24Obiekty funkcyjne przyklady
- dodanie elementów dwóch wektorów (double) a, b do
siebietransform(a.begin(), a.end(), b.begin(),
a.begin(), plusltdoublegt()) - zanegowanie wszystkich elementów
atransform(a.begin(), a.end(), a.begin(),
negateltdoublegt())
25Obiekty funkcyjne
template ltclass Arg, class Resultgt struct
unary_function typedef Arg argument_type type
def Result result_type template ltclass Arg1,
class Arg2, class Resultgt struct binary_function
typedef Arg1 first_argument_type typedef
Arg2 second_argument_type typedef Result
result_type
26Obiekty funkcyjne przyklady
- template ltclass Tgt struct plus
binary_functionltT,T,Tgt T operator()(const T
x, const T y) const Obiekt funkcyjny
obliczajacy x y. - template ltclass Tgt struct negate
unary_functionltT,Tgt T operator()(const T x)
const Obiekt funkcyjny obliczajacy x.
27Obiekty funkcyjne przyklady
- template ltclass Operationgt class binder1st
public unary_functionltOperationsecond_argument_t
ype, Operationresult_typegt protected
Operation op Operationfirst_argument_type
value public binder1st(const Operation x,
const Operationfirst_argument_type y)
result_type operator()(const argument_type x)
const - Konstruktor inicjalizuje op na x, value na y
- Operator () zwraca op(value, x)
- template ltclass Operation, class Tgt
binder1stltOperationgt bind1st(const Operation
op, const T x)
28EqualityComparable
- Typ T jest EqualityComparable jesli ma
zdefiniowany operator , którego wynik jest
konwertowalny do bool oraz - jest relacja równosci spelniajaca zalozenia-
Dla kazdego a a a- Jesli a b, to b a-
Jesli a b i b c, to a c
29Algorytmy Non-mutating
- template ltclass InputIterator, class
UnaryFunctiongt UnaryFunction for_each(InputIterat
or first, InputIterator last, UnaryFunction
f)Efekt Zaaplikowanie f do wyników
dereferencii kolejnych wartosci iteratora w
przedziale first, last), zaczynajac od first i
kontynuujac az do last - 1. Wymagania f nie
powinno wywolywac zadnych funkcji, które nie sa
zadeklarowane jako stale dla wartosci iteratora.
Zwraca f. Zlozonosc f jest wywolywana
dokladnie last - first razy. Uwaga Jesli f
zwraca jakas wartosc wynik jest ignorwany. - template ltclass InputIterator, class
EqualityComparablegtiterator_traitsltInputIteratorgt
difference_type count(InputIterator first,
InputIterator last, const EqualityComparable
value) Wymagania Typ T jest
EqualityComparable.Efekt Zwraca liczbe
iteratorów i z przedzialu first, last), dla
których warunek i value.
30Algorytmy Non-mutating
- templateltclass InputIterator, class
EqualityComparablegt InputIterator
find(InputIterator first, InputIterator last,
const EqualityComparable value)Wymagania Typ T
is EqualityComparable.Wynik Pierwszy iterator i
z przedzialu first, last), dla którego prawdziwy
jest warunek i value. Jesli zaden iterator z
tego przedzialu nie spelnia tego warunku zwracany
jest last. - templateltclass InputIterator, class
OutputIteratorgt OutputIterator
copy(InputIterator first, InputIterator last,
OutputIterator result) Efekt kopiuje elementy
z przedzialu first, last) do result,
result(last-first)) zaczynajac od first i
kontynuujac az do last. Dla kazdej nieujemnej
liczby n lt (last-first), wykonuje (resultn)
(firstn). Wynik result (last - first).
Wymagania result nie powinien byc z przedzialu
first, last). Zlozonosc dokladnie last - first
przypisan.
31Przyklad
templateltclass Tgt struct print public
unary_functionltT, voidgt print(ostream out)
os(out), count(0) void operator() (T x) os
ltlt x ltlt ' ' count ostream os int
count int main() int A 1, 4, 2, 8,
5, 7 const int N sizeof(A) / sizeof(int)
printltintgt P for_each(A, A N,
printltintgt(cout)) cout ltlt endl ltlt P.count ltlt "
objects printed." ltlt endl
32Gdzie szukac informacji?
- Musser Saini, STL Tutorial and Reference
- Lippman, "Istota jezyka C
- N.M.Josuttis, C bibliotek standardowa
podrecznik programisty - www-d0.fnal.gov/dladams/cxx_standard.pdf
- http//anubis.dkuug.dk/jtc1/sc22/open/n2356/
33Gdzie szukac informacji?
- http//www.sgi.com/tech/stl/ - implementacja STL
firmy Silicon Graphics, Inc. (SGI) - http//www.informatik.hs-bremen.de/brey/stlbe.htm
l - ksiazka "Designing Components with the C
STL" - http//www.xraylith.wisc.edu/khan/software/stl/ST
L.newbie.html - strona o STL z 1995 roku - http//www.cs.brown.edu/people/jak/proglang/cpp/st
ltut/tut.html - prosty tutorial - http//www.cs.rpi.edu/wiseb/xrds/ovp2-3b.html -
krótki opis STL'a - http//pages.cpsc.ucalgary.ca/kremer/STL/1024x768
/index.html - strona o STL'u
34