Standardna biblioteka C++

Embed Size (px)

Citation preview

  • 7/25/2019 Standardna biblioteka C++

    1/42

    Objektno orijentisano

    programiranje 1

    Standardna biblioteka

  • 7/25/2019 Standardna biblioteka C++

    2/42

    29.11.2011.Standardna biblioteka2

    Standardna biblioteka ablona

    Standard jezika C++ definie biblioteku ablona generikih funkcija i generikih klasa

    Biblioteka se zove Standard Template Library (STL) Svrha je efikasno ostvarenje esto korienih

    struktura podataka postupaka

    koji ne zavise od tipova od kojih se struktura sastoji koji se obrauju u postupcima

    Svi identifikatori u STL-u su u prostoru imena std

  • 7/25/2019 Standardna biblioteka C++

    3/42

    29.11.2011.Standardna biblioteka3

    Grupe ablona

    Uslune funkcije i klase relacioni operatori, funkcijske klase

    Jednostavne strukture podataka par, kompleksan broj

    Zbirke podataka i iteratori vektor, red, lista, stek, mapa, skup, tekst, niz bitova

    Algoritmi pretraivanje, ureivanje (sort), spajanje (merge)

  • 7/25/2019 Standardna biblioteka C++

    4/42

    29.11.2011.Standardna biblioteka4

    abloni relacionih operatora

    Postoji 6 relacionih operatora: == != < > = 4 od 6 se mogu izraziti pomou 2: == i < (i logikih)

    STL definie 4 izvedena operatora na osnovu 2

    kao globalne generike funkcije Programeri treba samo da preklope == i =

  • 7/25/2019 Standardna biblioteka C++

    5/42

    29.11.2011.Standardna biblioteka5

    Primer ablona relacionih operatora

    Pravougaonici se porede na osnovu povrinaclass Pravoug {

    float a,b;

    public:

    Pravoug(float str_a=1, float str_b=1){a=str_a; b=str_b;}float P()const{return a*b;}

    };

    bool operator==(Pravoug x, Prvoug y) {return x.P()==y.P();}

    bool operator

    }

  • 7/25/2019 Standardna biblioteka C++

    6/42

    29.11.2011.Standardna biblioteka6

    Funkcijske klase/strukture

    Funkcijska klasa (FK): klasa koja realizuje preklapanje operatorske funkcije operator()

    Funkcijska struktura (FS) se realizuje na isti nain

    abloni se u jeziku C++ ne mogu parametrizovati funkcijama Parametar ablona moe biti klasa/struktura, a to moe biti FK/FS FK/FS moe biti i generika (ablonska) klasa/struktura U STL-u neke generike klase i funkcije trae FK/FS kao argumente

    FK/FS moe definisati korisnik, ali u STL-u postoji niz gotovih FS FS su definisane u zaglavlju postoje unarne i binarne aritmetike, relacione i logike operacije

  • 7/25/2019 Standardna biblioteka C++

    7/42

    29.11.2011.Standardna biblioteka7

    Opti oblici funkcijskih struktura

    Unarna aritmetika operacijatemplate struct ime{

    T operator()(const T&);}

    Binarna aritmetika operacijatemplate struct ime{

    T operator()(const T&, const T&);}

    Unarna logika operacijatemplate struct ime{

    bool operator()(const T&);}

    Binarna logika ili relaciona operacijatemplate struct ime{

    bool operator()(const T&, const T&);}

  • 7/25/2019 Standardna biblioteka C++

    8/42

    29.11.2011.Standardna biblioteka8

    Nazivi funkcijskih struktura

    Unarna aritmetika operacija: negate

    realizuju se pomou unarnog operatora -

    Binarne aritmetike operacije: plus, minus, multiplies, divides, modulus realizuju se pomou: +, -, *, /, %

    Relacijske operacije: equal_to, not_equal_to, greater, less, greater_equal, less_equal realizuju se pomou: ==, !=, >, =,

  • 7/25/2019 Standardna biblioteka C++

    9/42

    29.11.2011.Standardna biblioteka9

    Korienje funkcijskih struktura

    Navedene generike FS mogu da se koriste za standardne proste tipove

    za klasne tipove je neophodno preklopiti odgovarajue operatore

    U navedenim generikim FS operatorska funkcija operator()se neposredno ugrauje u kod

    ne gubi se na efikasnosti

    esto se kao podrazumevana vrednost argumenta bibliotekih klasa

    navodi neka od navedenih bibliotekih funkcijskih klasa

  • 7/25/2019 Standardna biblioteka C++

    10/42

    29.11.2011.Standardna biblioteka10

    Primer

    Popunjavanje niza primenom operacije na elemente dva postojea niza#include

    #include

    using namespace std;

    template

    voidradi(const T a[], const T b[], T c[], int n){

    Op op; for(int i =0; i>n; citaj(a,n); citaj(b,n);

    radi(a,b,c,n); pisi(c,n);

    radi(a,b,c,n); pisi(c,n);

    }

  • 7/25/2019 Standardna biblioteka C++

    11/42

    29.11.2011.Standardna biblioteka11

    Parovi podataka

    Par dva podatka proizvoljnih tipova Definicija u zaglavlju

    template struct pair{

    A first; B second;

    pair():first(A()),second(B()){}

    pair(const A&, const B&);

    templatepair(const pair&);

    }

    templatebool operator@@(const pair&, const pair&);

    template

    pair make_pair(const A&, const B&);

  • 7/25/2019 Standardna biblioteka C++

    12/42

    29.11.2011.Standardna biblioteka12

    Korienje parova podataka

    Tipovi A i B mogu biti prosti ili klasni, ali ne mogu biti nizovi Neophodno je da postoje konverzije A(C) i B(D) operator@@ moe biti jedan od 6 relacionih: ==, !=, =

    (a,b)==(c,d) ako: a==c && b==d (a,b)

  • 7/25/2019 Standardna biblioteka C++

    13/42

    29.11.2011.Standardna biblioteka13

    Kompleksni brojevi

    Za rad sa kompleksnim brojevima - generika klasa u biblioteci template class complex;

    Potpune specijalizacije ablona za: float, double, long double Klasa podrava sve operacije kao sa bilo kojim numerikim tipom:

    aritmetike: +, -, *, /, =, +=, -=, *=, /= i relacione: == i !=

    Konstruktor: complex(const T& re=T(), const T& im=T()); Metode: T real()const; T imag()const; F-je: T real(const complex& z); T imag(const complex& z);

    T abs(const complex& z); T arg(const complex& z);

    T norm(const complex& z); //kvadrat potega

    complex polar(const T& r, const T& fi);complex conj(const complex& z);

    slino za: sqrt, exp, log, log10, sin, cos, tan, sinh, cosh, tanh za: pow(a,b)

    ako je a complex, b {int, realan broj, complex} ako je a realno, bje tipa complex

  • 7/25/2019 Standardna biblioteka C++

    14/42

    29.11.2011.Standardna biblioteka14

    Zbirke podataka

    Zbirke su objekti koji sadre podatke nekog tipa Drugi naziv: kolekcije Zbirke omoguavaju:

    dodavanje novih elemenata,

    dohvatanje postojeih elemenata izbacivanje nepotrebnih elemenata iz zbirke

    Zbirke imaju razliite unutranje strukture koje utiu na: efikasnost (brzinu) pojedinih operacija nad zbirkom:

    pristup elementu, dodavanje, izbacivanje

    zauzee memorije Primeri:

    vektori mali utroak memorije, brz pristup, sporo umetanje i izbacivanje liste vei utroak memorije, spor pristup, brzo umetanje i izbacivanje

  • 7/25/2019 Standardna biblioteka C++

    15/42

    29.11.2011.Standardna biblioteka15

    Vrste zbirki

    Dve osnovne grupe zbirki sekvencijalneredosled elemenata korisnik odreuje neposredno

    asocijativne na redosled elemenata korisnik moe da utie posredno(navoenjem neke strategije ureivanja elemenata)

    Klase raznih zbirki imaju slian interfejs, ali su nezavisne nemaju zajednikog pretka

    Za zbirke klasnih tipova,

    od projektanta klase elemenata zbirke se oekuje da obezbedi: podrazumevani konstruktor, konstruktor kopije, destruktor, operator= za asocijativne zbirke i operator== i operator

    =

    == !=== !=== !=

    ++ -- + -

    += -=

    ++ --++++++

    ->->->->

    []*i*i*i=*i*i=

    I(i) =I(i) =I(i) =I(i) =I(i) =

    Proizvoljni2-smerni1-smerniUlazniIzlazni

  • 7/25/2019 Standardna biblioteka C++

    21/42

    29.11.2011.Standardna biblioteka21

    Tipovi iteratora

    Tipovi iteratora su nezavisni od "vrste" iteratora Pod tipom se podrazumeva jeziki tip (klasa) Vrsta iteratora je odreena samom zbirkom,

    a tip iteratora navodi programer kada ga deklarie Postoje sledei tipovi:

    iterator direktni za promenljive zbirke

    const_iterator direktni za nepromenljive zbirke reverse_iterator obrnuti za promenljive zbirke const_reverse_iterator obrnuti za nepromenljive zbirke

  • 7/25/2019 Standardna biblioteka C++

    22/42

    29.11.2011.Standardna biblioteka22

    Osobine tipova iteratora

    Direktni: i+1 pokazuje na sledei element u odnosu na tekui

    Obrnuti (reverzni): i+1 pokazuje na prethodni element u odnosu na tekui

    Konstantni (za nepromenljive zbirke) preko njega se zbirka ne moe menjati ni umetanjem,

    ni izbacivanjem, ni menjanjem vrednosti elemenata

  • 7/25/2019 Standardna biblioteka C++

    23/42

    29.11.2011.Standardna biblioteka23

    Tipovi zbirki

    Vektori (vector) Redovi sa dva kraja (deque) Liste (list) Specijalne zbirke (queue, priority_queue, stack) Preslikavanja (map, multimap) Skupovi (set, multiset) Tekstovi (string) Nizovi bitova (vector, bitset)

  • 7/25/2019 Standardna biblioteka C++

    24/42

    29.11.2011.Standardna biblioteka24

    Vektori

    Jednodimenzioni nizovi neogranienog kapaciteta Omoguavaju:

    efikasan pristup elementima po proizvoljnom redosledu efikasno dodavanje na kraj i izbacivanje sa kraja neefikasno dodavanje i izbacivanje sa poetka i u sredini automatsku promenu kapaciteta

    standard ne propisuje inkrement promene kapaciteta

    Spadaju u sekvencijalne zbirke Koriste iteratore sa proizvoljnim pristupom

  • 7/25/2019 Standardna biblioteka C++

    25/42

    29.11.2011.Standardna biblioteka25

    Klasa vector

    Deklaracija se nalazi u zaglavlju template class vector;

    Eje tip elemenata vektora Klasa poseduje:

    konstruktore podrazumevani (stvara prazan vektor) konstruktor kopijevector(unsignedvel, const E& x=E());

    template vector(It prvi,It posl);kopira elemente neke zbirke iz intervala [prvi, posl)

    destruktor operator=

    metode (veliki broj)

  • 7/25/2019 Standardna biblioteka C++

    26/42

    29.11.2011.Standardna biblioteka26

    Metode klase vector (1)

    voidassign(unsignedn, const E& x=E());

    template voidassign (It prvi, It posl);

    unsignedsize()const;

    unsignedmax_size()const;bool empty()const;

    voidresize(unsignedvel, const E& x=E());

    unsignedcapacity()const;

    voidreserve(unsignedn);

  • 7/25/2019 Standardna biblioteka C++

    27/42

    29.11.2011.Standardna biblioteka27

    Primer

    #include

    #include

    using namespace std;

    voidmain(){ vector v(1000);

    cout

  • 7/25/2019 Standardna biblioteka C++

    28/42

    29.11.2011.Standardna biblioteka28

    Metode klase vector (2)

    iterator begin();

    const_iterator begin()const;

    iterator end();

    const_iterator end()const;reverse_iterator rbegin();

    const_reverse_iterator rbegin()const;

    reverse_iterator rend();

    const_reverse_iterator rend()const;

  • 7/25/2019 Standardna biblioteka C++

    29/42

    29.11.2011.Standardna biblioteka29

    Primer

    #include

    #include

    usage namespace std;

    vector v(10);

    typedef vector::iterator Vit;

    typedef vector::reverse_iterator Vrit;for(Vit i=v.begin(); i!=v.end(); cin>>*i++);

    for(Vrit i=v.rbegin(); i!=v.rend(); cout

  • 7/25/2019 Standardna biblioteka C++

    30/42

    29.11.2011.Standardna biblioteka30

    Metode klase vector (3)

    E& operator[](unsignedind);

    const E& operator[](unsignedind)const;

    E& at(unsignedind); //0

  • 7/25/2019 Standardna biblioteka C++

    31/42

    29.11.2011.Standardna biblioteka31

    Metode klase vector (4)

    iterator insert(iterator poz, const E& x=E());

    voidinsert(iterator poz, unsignedn,

    const E& x=E());

    template voidinsert(iterator poz,

    It prvi, It posl);

    iterator erase(iterator poz);

    iterator erase(iterator prvi, iterator posl);

    voidclear();voidswap(vector & v);

  • 7/25/2019 Standardna biblioteka C++

    32/42

    29.11.2011.Standardna biblioteka32

    Globalna funkcija sa vector arg

    Leksikografsko poreenje 2 vektora:bool operator@@(const vector&v1, const vector&v2);

    // @@ {==,!=,=}

    // v1==v2 ako imaju jednak broj elemenata// i ako su odgovarajui elementi e1==e2

    // v1

  • 7/25/2019 Standardna biblioteka C++

    33/42

    29.11.2011.Standardna biblioteka33

    Primer

    #include

    #include

    using namespace std;

    voidmain(){

    vector v; int k;

    coutk, k!=9999){

    if(v.size()==v.capacity()) v.reserve(v.size()+10);

    // bez eksplicitne rezervacije dodaje se 1/2 kapac.

    v.push_back(k);

    }

    v.reserve(v.size()); //ne mora imati efekat

    int s=0; for(unsignedi=0; i

  • 7/25/2019 Standardna biblioteka C++

    34/42

    29.11.2011.Standardna biblioteka34

    Redovi sa dva kraja

    Dinamiki nizovi koji pored mogunosti vektora omoguavaju i efikasno dodavanje elementa na i uklanjanje sa poetka niza

    Definisani su u biblioteci template class deque;

    Naziv potie od double-ended queue Spadaju u sekvencijalne zbirke, koriste iteratore sa proizvoljnim pristupom U odnosu na ablon vector, ne postoje samo metode:

    capacity() i reserve() Postoje metode:

    void push_front(const E& x);

    void pop_front();

    Pogodna struktura za realizaciju FIFO bafera

  • 7/25/2019 Standardna biblioteka C++

    35/42

    29.11.2011.Standardna biblioteka35

    Liste

    Omoguavaju efikasno umetanje i izbacivanje elemenatai u unutranjosti zbirke

    Efikasan sekvencijalni pristup

    Neefikasan pristup po proizvoljnom redosledu U zaglavlju :template class list;

    Spadaju u sekvencijalne zbirke i koriste dvosmerne iteratore

    Iste funkcije kao za deque, sa izuzetkom operator[]() i at()

  • 7/25/2019 Standardna biblioteka C++

    36/42

    29.11.2011.Standardna biblioteka36

    Metode klase list

    voidsplice(iterator poz, list& lst);

    voidsplice(iterator poz, list& lst, iterator i);

    voidsplice(iterator poz, list& lst,iterator prvi, iterator posl);

    voidremove(const E& x);

    templatevoidremove_if(U u);

    voidunique();

    template voidunique(U u);

    voidmerge(list& lst);

    template voidmerge(list& lst, U u);

    void sort();

    template voidsort(U u);

    voidreverse();

  • 7/25/2019 Standardna biblioteka C++

    37/42

    29.11.2011.Standardna biblioteka37

    Red, prioritetni red i stek

    Red, prioritetni red i stek su specijalne zbirke kod reda (queue) se podaci dodaju na kraj, a uzimaju sa poetka

    kod prioritetnog reda (priority_queue) podaci se uzimajupo opadajuem prioritetu

    kod steka (stack) se podaci dodaju na kraj (vrh) i uzimaju sa kraja Specijalne zbirke koriste ranije opisane zbirke U zaglavljima , odnosno :

    template class queue;

    template

    class priority_queue;

    template class stack;

  • 7/25/2019 Standardna biblioteka C++

    38/42

    29.11.2011.Standardna biblioteka38

    Preslikavanja

    Elementi zbirki preslikavanja su parovi vrednosti (klju, podatak) Elementi su ureeni po vrednosti kljua

    to omoguava brzo pronalaenje podatka na osnovu kljua

    Preslikavanja spadaju u asocijativne zbirke

    Preslikavanja koriste dvosmerne iteratore Preslikavanje kljua u podatak moe da bude:

    jednoznano (jedinstvena vrednost kljua) zbirka map vieznano (vie podataka u zbirci za jednu vrednost kljua) multimap

    U zaglavlju :template class map;

    template class multimap;

  • 7/25/2019 Standardna biblioteka C++

    39/42

    29.11.2011.Standardna biblioteka39

    Skupovi

    Brzo pronalaenje elemenata na osnovu njihovih vrednosti Preslikavanja koja kljueve preslikavaju u sebe

    (elementi sadre samo klju, odnosno kljuje i podatak) Skupovi su ureeni elementi su ureeni po vrednostima Spadaju u asocijativne zbirke i koriste dvosmerne iteratore Slino preslikavanjima, skupovi mogu biti:

    bez ponavljanja elemenata set sa moguim duplikatima elemenata multiset

    U zaglavlu :template class set;

    template class multiset;

  • 7/25/2019 Standardna biblioteka C++

    40/42

    29.11.2011.Standardna biblioteka40

    Tekstovi (stringovi)

    Tekstovi se sastoje od niza znakova nekog tipa Za rad sa tekstovima promenljive duine ablon basic_string Klase u zaglavlju :

    obratiti panju da su i razliite biblioteke

    template class basic_string; Omoguava generisanje klasa za razne tipove znakova

    (npr. za 8-bitne ASCII znake, za 16-bitne UNICODE znake) Vrlo esto se koriste char znaci u tekstovima, pa je definisan tip:

    typedef basic_string string; //generisana klasa

    Postoje sve metode klase vector izuzev push_back() i pop_back() Mnogo dodatnih metoda i operatora za rad sa tekstovima

    assign(=), append(+=), +, , rel.ops., getline, compare,substr, copy, insert, replace, erase, find

  • 7/25/2019 Standardna biblioteka C++

    41/42

    29.11.2011.Standardna biblioteka41

    Nizovi bitova

    Dve varijante: (1) vector i (2) bitset (1) specijalizacija ablona vector za elemente tipabool

    dinamiki nizovi promenljivih duina sa efikasnim skladitenjem bitova bitovima se pristupa kao i bilo kojim drugim elementima vektora

    primer:vector v(20);for(unsignedi=0; i>v[i++]);

    for(vector::iterator i=v.begin(); i!=v.end(); cout,

  • 7/25/2019 Standardna biblioteka C++

    42/42

    29.11.2011.Standardna biblioteka42

    Algoritmi

    STL podrava sledee kategorije algoritama: algoritmi nad pojedinanim podacima (min, max, swap)

    obrada pojedinanih elemenata zbirki (for_each, fill, generate,...)

    pretraivanje zbirki (find, min/max_element, count, search,...)

    obrade zbirki: kopiranje (copy, copy_backward) zamena (replace, replace_if,...) uklanjanje (remove, remove_if, remove_copy,..., unique,...)

    obrtanje (reverse, reverse_copy) poreenje (equal, lexicographical_compare) permutacije (next_permutation, prev_permutation)

    obrade ureenih sekvencijalnih zbirki (sort, merge, binary_search)