Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Haladó C++ Programozás Az STL sablonkönyvtár felhasználói szemszögből 2013. október.

Hasonló előadás


Az előadások a következő témára: "Haladó C++ Programozás Az STL sablonkönyvtár felhasználói szemszögből 2013. október."— Előadás másolata:

1 Haladó C++ Programozás Az STL sablonkönyvtár felhasználói szemszögből október

2 STL 2 Mai témák STL  bevezető  adattároló struktúrák (konténerek) egyelőre csak alaptípusokkal  léptetők (iterátorok)  algoritmusok

3 STL 3 STL sablonkönyvtár Szóismétlés, hiszen  S:Standard=Szabvány(os(ított))  T:Template=Sablon  L:Library=Könyvtár (Gyűjtemény) Mi van benne?  adattárolási struktúrák (konténerek)  műveletsablonok ( minus, plus, … ) mert a globális operátorokat nem lehet örökíteni alapértelmezett viselkedés: rendes operátorokat hívja meg ( +, -, <, =, * )  algoritmusok konténerekre (bepakol, kiszed, rendez, keres, feje tetejére állít, …)  segédanyagok (adatelérésre, memóriakezelésre) Mi nincs benne?  teljes egyetértés SGI vs. Microsoft, etc. van, ami csak ajánlás, de nem kötelező implementálni  fordítási hibaüzenetekhez értelmezőszótár meg kell tanulni a többsoros hibaüzenetekből a lényeget kiolvasni Van hozzá  nagyon jó dokumentáció (http://www.sgi.com/tech/stl) Elterjedettsége  nagyfokú  dinamikus adatkezelést lebonyolító eljárás ma gyakorlatilag ritkaság nélküle (és értelmetlen is)

4 STL 4 STL - koncepció Duális világ: keret (váz) + anyag (esszencia) (nem lesz számonkérve, de segít megérteni) pl.: Ember TestÉrtelem CsontHúsLélekSzellem nem testi.. attitűd fantázia

5 STL 5 avagy... kijelentés alanyállítmány bővítmények... ez témájában jó példa, mert a nyelvről szól C++ is egy nyelv...

6 STL 6 Ami pedig minket illet Ezzel már tényleg lehet komoly kód- újrahasznosítást művelni! program kódadat kódsablonegyedi kódadatstuktúraegyedi adat tervezési minták (design patterns) – félév 3. része STL, főleg a konténerek, de tágabb körben a hozzájuk szorosan kapcsolódó algoritmusok is adat – kód szétválasztás megvan architekturálisan is, már az XT-ben is...

7 STL 7 Coming soon: vector vector a(10);  10 hosszú int tömb for (int i=0;i<10;++i) a[i]=2*i;  op[]-ral indexelt direkt elemelérés nemcsak olvasásra, hanem írásra is! a.resize(15);  dinamikus átméretezés a.push_back(4);  elem hozzátoldása a végéhez cout<

8 STL 8 Adattárolási struktúrák Elvárások a konténerrel szemben Transzparens működés memóriakezelés szempontjából (new – delete elrejtése, memóriaszivárgás kiküszöbölése)  dinamikus nyújtózkodás esetén  másoláskor  születésnél/elhaláskor Jellemzők lekérdezése  méret (elemszám)  legkisebb/legnagyobb elem  melyik elemből mennyi van

9 STL 9 Adattárolási struktúrák Elvárások a konténerrel szemben Elemek közvetlen elérése Adatbeszúrás/-módosítás/-törlés Halmaz- és egyéb algoritmusok támogatása (az “elvárás” alatt azt is értsd, hogy a nagyHF- ben elvárjuk)

10 STL 10 Konténerek Legjellemzőbb felosztás: Szekvenciális szerkezetek a felhasználó határozza meg az elemek sorrendjét  vectordinamikus méretű, közvetlen elérésű tömb  listkétirányba láncolt lista  deque előre-hátra dinamikusan nyújtózkodó k.e. tömb Asszociatív szerkezetek ő magának sorrendezi az elemeket, hogy hatékonyan tudja majd kezelni őket  set rendezett halmaz  maprendezett asszociatív tömb  multisetelemismétlődést megengedő rend. halmaz  multimap1:N leképezést megengedő asszoc. tömb

11 STL 11 Konténerek Egyéb szerkezetek  hash gyorsabb asszociáció, de nem egységes szabvány, ezért soruljuk az egyéb szerkezetek közé  ~_map  ~_set  ~_multimap  ~_multiset Megjegyzés:  Java-ban szabványos a hash* tárolási struktúra, ott gyakrabban használjuk, C++ map<> pedig a java TreeMap<> -jához hasonlít.

12 STL 12 Konténerek Egyéb szerkezetek  hash gyorsabb asszociáció, de nem egységes szabvány, ezért soruljuk az egyéb szerkezetek közé  ~_map  ~_set  ~_multimap  ~_multiset Megjegyzés:  Java-ban szabványos a hash* tárolási struktúra, ott gyakrabban használjuk, C++ map<> pedig a java TreeMap<> -jához hasonlít.

13 STL 13 Konténerek Speciális szerkezetek  slistegy irányba láncolt lista  bit_vectorbool értékek tárolására  ropeszövegeknek  stackverem  heapkupac  queueFIFO szerkezet  bitset meghatározott bitszámú adatoknak  karakterláncokbizonyos műveletek gyakoriabbak, célorientált optimalizálás Karakterláncokra miért készítettek sablont, miért nem csak char típusra definiálták?

14 STL 14 Konténerek Speciális szerkezetek++  Régebbi NagyHF-k tömörítő konténer  log-olás dupla indexelésű asszociáció  (mikor-hol mi a helyzet, ~www.idokep.hu) oda-vissza asszociáció  kétnyelvű szótár egyéb lehetőségek...  cache-elt elérés a leggyakrabban használt adatokra  unpop művelet támogatása  stb.

15 STL 15 Konténerek Speciális szerkezetek++  Újabb NagyHF-k Mátrix  “flat” tárolási struktúra  Beszúrás, törlés, módosítás  Oszlopra, sorra, elemre  Transformáció  Transzponálás  Aritmetika  Összeadás, szorzás  Determináns  Inverz Asszociatív mátrix  Mátrix tárolási struktúrát adottnak véli  Asszociatív címzés sorra, oszlopra

16 STL 16 A vector és a lista A vector T dinamikus tömbjét valósítja meg. Az elemek közvetlen egymás után, egy tömbben vannak a memóriában. Elemeket el lehet érni tömbindexeléssel, működik a pointer-aritmetika. A túlindexelés (tömb méretén felüli elem írása/olvasása) nem definiált hatást eredményez. vector1_demo.cc vector2_demo.cc  kiírórutin ostream &operator<<(ostream&, const X&) elterjedt használata, később is..

17 STL 17 feltuningolt pointer A vector és a lista A list két irányba láncolt T listát valósít meg list1_demo.cc mindkét irányban egyszerűen bővíthető/törölhető, sőt elembeszúrás is O(c) idő alatt zajlik le nincs közvetlen elérés: indexelés nincs rá értelmezve, helyette iterátorral lehet benne lépkedni list2_demo.cc beépített algoritmusok list3_demo.cc

18 STL 18 A vector és a lista vector Value0Value1Value2X list Iterator1 Value1 operator++() Iterator2 Value2 operator*() operator++() Iterator3 Value3 operator*() operator++() IteratorN X operator*() X end() begin() Value_n operator[ ](0) operator[ ](2) operator[ ](1) Value_n+1 push_back() operator--() pszeudo-iterator, vagyis nincs alatta érték, az opetator++() nem ad értelmes választ, de arra jó, hogy az end()- del összehasonlítsuk ? Hol van a vector esetén az iterátor? ! Az értékre mutató pointer az iterátor.

19 STL 19 vector vs. list elem elérése beszúrás attól függ, hova:  előre  középre  végére objektumok összefűzése, intervallumok manipulálása ( insert(), erase(), copy() etc.) vectorlistdeque O(c)O(n)

20 STL 20 coming soon: map map laz;  időpontokhoz rendelünk double értékeket laz[TimeStamp(06,30)]=37.1; laz[TimeStamp(10,05)]=37.5; laz.insert(pair (TimeStamp(09,20),37.6));  elemek beszúrása laz[TimeStamp(06,30)]=36.9;  elem felülírása double x=laz[TimeStamp(10,05)];  érték kiolvasása double y=laz[TimeStamp(00,00)];  nem definiált kulcs alól default érték kiolvasása (+ beszúrása!) map ::iterator laz_0735it=laz.find(TimeStamp(07,35));  keresés kulcs szerint if (laz_0735it!=laz.end()) pair laz_0735=*laz_0735it;  iterátor alatt kulcs-érték pár map ::iterator laz_reggelit=laz.lower_bound(TimeStamp(08,00));  nem pontos, de közeli (megadottnál nagyobb kulcsú) elem keresése

21 STL 21 Rendezett asszociatív tárolóstruktúrák (előzetes összefoglaló) Ide tartozik  map, multimap, set, multiset Erősség  bizonyos algoritmusok támogatása rendezettségből adódóan a keresés O(log(n)) egyediség alapértelmezetten garantált (map, set esetében) Hogyan biztosítjuk a rugalmasságot  elemeire iterátorok mutatnak (akárcsak vector, list esetében)  rendezés szabálya megadható függvényosztállyal, azaz funktorral  általános elérési felület (interface) begin(), end(), empty(), insert()-ek, clear(), konstruktor intervallummal  külső függvényekre iterátorokkal kell illeszteni mindegyik konténert mint intervallumot

22 STL 22 -torok latin  igék: fungor,fungi,functusvégrehajt, cselekszik itero,iterare,iteravi,iteratusismétel, hajtogat (szavakat, nem origamit)  képzők (igék negyedik (passzív) alakjából): -tus/-sus → -tor/-sorcselekvő alany (ld. még: diktátor) -tus/-sus → -tion/-sionszenvedő alany magyarul  functorvégrehajtó  iteratorismétlő

23 STL 23 -torok C++ Algoritmusok Műveletek Konténer Beépített algoritmusok másol, töröl, keres, rendez, összegez, …léptet… rendez: < összegez: + keres: <,= léptet: ++,-- Kapcsolódás egymáshoz? funktorok iterátorok funktorok

24 STL 24 Functor (function object) olyan objektum, ami függvényként használható  mert rendelkezik publikus operator()-ral (zárójel operátorral) haszna:  egzakt típus örököltethető, stb  ahová a kód egy fv.-t vár, oda beilleszthető mi közünk hozzá?  STL épít rá rendezési reláció, transzformáló rutin, konténerhez feltöltőrutin...  amúgy is ritkán használt szabványos nyelvi elem, tehát a HCPP kurzusnak tárgya

25 STL 25 Functor mint rendezési reláció A példák egymásra épülnek, bemutatják a funktor erejét:  functor1.cc  functor2.cc  functor3.cc  functor4.cc  functor5.cc Tehát az ereje:  képes függvényként működni  inicializálható  lehet belső memóriája

26 STL 26 Iterátorok “objektummá felturbózott pointer”  de mint láttuk, olykor a pointer is lehet iterátor (pl. vector vagy hagyományos tömb esetén)  Miért?Mert template programozás esetén (akárcsak a makróknál) nincs típusellenőrzés, csupán felhasználáskor kell, hogy a meghívott eljárás értelmezhető legyen. A pointerre az iterátor-eljárások (léptetés, értékadás, op*()) értelmezhetőek. Mire használjuk őket?  lépni lehet a konténeren belül elemről elemre  pontokat, intervallumokat lehet definiálni vele a konténeren belül  Általánosan (mint már láthattuk): különböző tárolók interfészei algoritmusok számára pl. count() list-re, find() vectorra

27 STL 27 Altípusai /Concepts/ (funkcionalitás szerint csoportosítva): "trivial" iterátor - az iterátort mint emelet elérő objektumot jellemzi  Konstruktor X x;  Érték elérése *x;  Érték módosítása *x=y; (ha X módosítható - ez nincs mindig így)  Tag elérése x->m (ezt nem támogatja mindegyik fordító)

28 STL 28 Altípusai /Concepts/ (funkcionalitás szerint csoportosítva): előre haladó “forward iterator” (csak egy irányba léptethető)  ++x; - referenciával tér vissza  x++ - ekvivalens: {X tmp=i; ++i; return tmp;} kétirányú “bidirectional” (oda-vissza léphet)  előre haladón túl: --x x--

29 STL 29 Altípusai /Concepts/ (funkcionalitás szerint csoportosítva): közvetlen elemelérésű “random” (tetszőleges lépésközzel haladhat) kétirányún túl:  pointeraritmetika (+,-,+=,-=,<)  közvetlen elemelérés: x[n];  közvetlen elemmódosítás: x[n]=y;

30 STL 30 Altípusai /Concepts/ (funkcionalitás szerint csoportosítva): bemeneti “input” (az értéket csak kiolvasni lehet, írni nem!) triviálison (persze nem írható) és előre haladón túl:  t=*x++; kimeneti “output” (csak írható) bizonyos szempontból a bemeneti ellentettje  copy konstruktor  érték megadása: *x=t; *x++=t;

31 STL 31 Konstans (csak olvasható) iterátorok konténer ::const_iterator név; konstans függvényekben használandó utal arra, hogy a konténert csak olvassuk példa: ostream &operator &);

32 STL 32 Mire jó az, hogy funkcionális csoportokat definiálunk? A könyvtári algoritmusok  iterátorokkal érik el a konténereket  viszont mindig csak bizonyos részeit használják az iterátorok funkcióinak (pl. összegzésnél: érték olvasása a=*x és előreléptetés ++x ) Bevezethetünk saját konténert/iterátort, és hogy zökkenésmentes legyen ennek illesztése az algoritmusokhoz, ezek a funk. csoportok definiálják, milyen dolgokat kell az iterátorunknak teljesítenie. Ha saját algoritmust írunk, ami egy tárolót iterátorokon keresztül ér el, akkor ezekkel a tulajdonságokkal specifikálhatjuk, mit várunk el az iterátoroktól.

33 STL 33 iterátorokkal kapcsolatos definíciók: "utolsó utáni első" "érvényes" vagy elérhető az iterátor alatt tárolt érték, vagy "utolsó utáni első" "növelhető" definiált a ++x - "utolsó utáni első"-kre ez nem igaz j "elérhető" i -ből, ha véges ++i alkalmazása után fennáll i == j [i,j) olyan "intervallum"-ot jelöl, mely i -től j -ig (j bele nem értendő) terjed [i,j) akkor "érvényes intervallum", ha i és j is érvényes, valamint i -ből "elérhető" j

34 STL 34 Asszociatív tömb (map) Rendezett asszociatív tár, kulcs=>érték párokkal tulajdonságai:  Az értékek nemcsak külső és belső find() függvénnyel, hanem operator[] -lel is elérhetőek (írásra és olvasásra) map1_demo.cc, map2_demo.cc  Mivel rendezett tömbről van szó, a keresés/beszúrás/törlés O(log(n)) időben történik  beszúrás történhet súgással (hint), így az O(log(n)) tovább rövidíthető

35 STL 35 Asszociatív tömb (map)  A konténerben párokban vannak az adatok tárolva pair, iterátor alól ezeket  Key k=(*iter).first és Value v=(*iter).second -del tudjuk kinyerni.  iterátor alatt a kulcs nem módosítható: (*iter).first=new_k nem működik - hiszen akkor máshova kerülne az adat a rendezett tömbben.  két azonos kulcsú adat nem szerepelhet a tárolóban (erre a multimap lett kitalálva)  Pl.: map3_demo.cc

36 STL 36 Házi feladat - Lázgörbe Statikus tömbök vektorrá alakítása + Vektorok elemeinek párosítása és map-be tétele + map kiírása  az alábbi három tömbből készíts három vektort: int hour[]={6,8,14,23,18,16,21}; int min[]={11,22,33,44,55,31,41}; double dat[]={36.5,37.3,38.5,37.1,37.1,37.5,37.4};  definiáld a TimeStamp osztályt! Van benne kétparaméteres konstruktor (óra,perc) rendezési reláció (op<), ez const, és a paramétere is const &! friend kiírófv. (óra:perc)  Töltsd fel a vektorokból a map konténert for ciklussal iteráljon végig egyszerre a vektorokon  az órának és percnek megfelelő elemekből hozza létre a TimeStamp-et  a map-be az adatokat op[] vagy insert() tagfv.-nyel is beteheted  Írd ki a map tartalmát A megoldásban támaszkodj az előadás példaprogramjaira.

37 STL 37 Halmaz (set) Elemek rendezett sora. Használjuk, ha:  az elemek beviteli sorrendjének nincs szerepe ha direkt azt szeretnénk, hogy a beviteli sorrendtől ftl. saját sorrendünk legyen  gyakorta kell halmazműveleteket végezni  gyakorta kell keresni az elemek között  az egyediség garantálásával nem akarunk külön foglalkozni (automatikusan elvégzi)  Pl.: set1_demo.cc, set2_demo.cc

38 STL 38 rendezési reláció asszociatív konténerekben tárolt elemeket sorba kell tudni rendezni beépített típusokra ez működik pointerekre is (ami nekünk fejfájást is okozott – emlékezz: funktorok demói) osztályokra???  definiálni kell a bool operator<(const T&, const T&) függvényt. Pl. less1_demo.cc

39 STL 39 rendezési reláció Mi van akkor, ha ettől eltérő sorrendben szeretnénk az adatokat tárolni?  A sablon szerint: set - tehát Compare: összehasonlítás megadható Hogyan?  Típusa: less, ami egy funktor  Ennek egyetlen tagfüggvénye: bool operator()(const T& x, const T& y)  alapból az operator< -t hívja meg  ezt kell felüldefiniálni.  Pl. less2_demo.cc


Letölteni ppt "Haladó C++ Programozás Az STL sablonkönyvtár felhasználói szemszögből 2013. október."

Hasonló előadás


Google Hirdetések