Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

Hasonló dokumentumok
STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

.Net adatstruktúrák. Készítette: Major Péter

Bevezetés a programozásba 2

Programozási technológia

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

C++ Standard Template Library (STL)

Generikus osztályok, gyűjtemények és algoritmusok

Fejlett programozási nyelvek C++ Iterátorok

Adatszerkezetek 1. Dr. Iványi Péter

XIII. STL. Tároló Bejáró Algoritmus. XIII.1 A vector #include <vector> #include <vector> #include <algorithm> using namespace std;

Elemi adatszerkezetek

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Verem Verem mutató 01

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

Komputeralgebra Rendszerek

félstatikus adatszerkezetek: verem, várakozási sor, hasítótábla dinamikus adatszerkezetek: lineáris lista, fa, hálózat

117. AA Megoldó Alfréd AA 117.

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Adatszerkezetek és algoritmusok

Generikus Típusok, Kollekciók

A C++ Standard Template Library rövid összefoglalás

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Alkalmazott modul: Programozás

Maximum kiválasztás tömbben

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

500. CC Megoldó Alfréd CC 500.

500. AA Megoldó Alfréd AA 500.

Programozás. C++ típusok, operátorok. Fodor Attila

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Információs Technológia

Bevezetés a programozásba I.

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Adatszerkezetek és algoritmusok

Programozás alapjai II. (7. ea) C++

.AA Megoldó Alfréd AA.

500. DD Megoldó Alfréd DD 500.

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus adatszerkezetek. Dinamikus adatszerkezetek. Önhivatkozó struktúrák. Önhivatkozó struktúrák

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Bevezetés a programozásba. 11. Előadás: Esettanulmány

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Szoftvertechnológia 3. előadás. Objektumorientált tervezés: alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás II. 2. Dr. Iványi Péter

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Gráfalgoritmusok: összefüggőség, párosítás páros gráfban

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Láncolt lista Bináris keresőfa Gráf Hasító táblázat. Programozás II. labor 2. rész (Adatszerkezetek)

Bevezetés a programozásba I.

Programozás C++ -ban 2007/4

2. Beadandó feladat dokumentáció

Adatszerkezetek Bevezetés Adatszerkezet Adatszerkezet típusok Műveletek Bonyolultság

Adatszerkezetek 1. előadás

0. Megoldó Manó 0. Programozás alapjai 2. (inf.) pót zárthelyi gyak. hiányzás: 2 n/kzhp: n/11,5. ABCDEF IB.028/2.

128. AA Megoldó Alfréd AA 128.

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Algoritmusok és adatszerkezetek I. 1. előadás

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Bevezetés a Programozásba II 10. előadás. Dinamikus memóriakezelés

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

228. AA Default Konstruktor AA 228.

Bevezetés a Programozásba II 5. előadás. Objektumorientált programozás és tervezés

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Komputeralgebra rendszerek

Algoritmizálás + kódolás C++ nyelven és Pascalban

Buborékrendezés: Hanoi Tornyai: Asszimptótikus fv.ek: Láncolt ábrázolás: For ciklussal:

A lista adatszerkezet A lista elemek egymásutániságát jelenti. Fajtái: statikus, dinamikus lista.

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Szövegek C++ -ban, a string osztály

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

Programozás C++ -ban

503.AA Megoldo Arisztid 503.A

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Collections. Összetett adatstruktúrák

III. Adatszerkezetek és algoritmusok

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

ADATSTRUKTÚRÁK ÉS ALGORITMUSOK

Adatbáziskezelés. Indexek, normalizálás NZS 1

1. Alapok. Programozás II

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Adatszerkezetek 7a. Dr. IványiPéter

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

2. Beadandó feladat dokumentáció

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása. Biztonságos adattípusok megvalósítása

3. Beadandó feladat dokumentáció

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Átírás:

Pázmány Péter Katolikus Egyetem Információs Technológiai és Bionikai Kar Bevezetés a Programozásba II 12. előadás (Standard Template Library) 2014.05.19. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Adatszerkezetek Adatszerkezetnek nevezzük adott típusú adatok valamilyen megadott struktúrában felépített halmazát A főbb adatszerkezetek a legtöbb programozási nyelvben definiáltak, ezeket gyűjteményeknek (collection) nevezzük tömb (vektor): elemek rögzített hosszú sorozata, amelyben bármely elem közvetlenül elérhető verem (LIFO): a végén bővíthető, az utolsó elem érhető el sor (FIFO): a végén bővíthető, az első elem érhető elem lista: tetszőleges helyen bővíthető asszociatív tömb: speciális értékekkel indexelt, tetszőleges helyen bővíthető PPKE ITK, Bevezetés a programozásba II 12:2

A Standard Template Library A Standard Template Library (STL) egy olyan programkönyvtár, amely előre megírt sablonos adatszerkezeteket és algoritmusokat tartalmaz minden típusra hatékonyan alkalmazhatóak szabványosan, objektumorientáltan implementáltak robosztusak (az adatszerkezetek gyorsan cserélhetőek) Az STL-en keresztül adatainkat különféle adatszerkezetekbe szervezhetjük, és rajtuk sokféle beépített algoritmust futtathatunk pl. keresések, rendezések, kiválasztások, PPKE ITK, Bevezetés a programozásba II 12:3

A verem A verem (stack), más néven LIFO (Last-In-First-Out) egy olyan adatszerkezet, amelynek csak a tetejére tudunk helyezni új elemet (push), illetve csak a tetőelemet kérdezhetjük el (top), és vehetjük ki (pop), tehát csak azt az elemet tudjuk elérni és kivenni, amit utoljára helyeztünk bele 19 ppuuuuu(19) 19 ttoooo 19 ppoooo 130 130 130 1 1 1 56 56 56 PPKE ITK, Bevezetés a programozásba II 12:4

A verem mérete tetszőlegesen növelhető (a maximális méret korlátozható), és mivel csak a tetőelem érhető el, hatékonyan implementálható A verem típust a stack osztály valósítja meg, fontosabb műveletei: push: érték behelyezése a verem tetejére pop: tetőelem kivétele top: tetőelem lekérdezése size: méret lekérdezése empty: üres-e a verem PPKE ITK, Bevezetés a programozásba II 12:5

A verem Pl.: #include <stack> using namespace std; stack<int> intstack; // üres verem létrehozása intstack.push(-56); // elemek behelyezése intstack.push(1); intstack.push(130); intstack.push(19); cout << intstack.top() << endl; // eredmény: 19 intstack.pop(); cout << intstack.top() << endl; // eredmény: 130 PPKE ITK, Bevezetés a programozásba II 12:6

Példa Feladat: Készítsünk egy alkalmazást, amelyben egy kifejezést színezhetünk a zárójelezése szerint. minden egyes új zárójel nyitása a kifejezés egy új szintje, amelyet véletlenszerűen színezünk ki amikor egy zárójeles rész véget ér, a korábbi színre kell visszalépnünk, ez veremmel szabályozható mindezt egy megjelenítő vezérlő segítségével (ExpressionDisplayWidget), amely egy veremben tárolja a véletlenszerűen generált színeket (_colorstack) a kifejezés helyes zárójelezettségét ellenőrizzük is (check), szintén veremmel PPKE ITK, Bevezetés a programozásba II 12:7

Példa Tervezés: class ExpressionDisplay Widget ExpressionDisplayWidget «struct» ExpressionDisplayWidget:: Color + R :int + G :int + B :int + Color(int, int, int) -_colorstack - _goodexpression :bool - _popstack :bool - _currentindex :int - _expressionstring :std::string - _colorstack :std::stack<color*> - _canvas :genv::canvas* + ExpressionDisplayWidget(int, int, int, int, std::string) + ~ExpressionDisplayWidget() + show() :void {query} + handleevent(genv::event) :void - check() :bool Application MyApplication + MyApplication(int, int) + ~MyApplication() PPKE ITK, Bevezetés a programozásba II 12:8

A sor A sor (queue), más néven FIFO (First-In-First-Out) egy olyan adatszerkezet, amelynek a végére tudunk helyezni új elemet (enqueue, push), illetve csak az elejét kérdezhetjük el (first, front), és vehetjük ki (dequeue, pop), tehát csak azt az elemet érhetjük el és vehetjük ki, amit a legrégebben helyeztünk be -56 1 130 19 ppppppp(19) ffffffffff -56 1 130 19-56 1 130 19 pppppp PPKE ITK, Bevezetés a programozásba II 12:9

A sor az első elem utáni elemek rejtettek (esetleg az utolsü lekérdezhető), mérete tetszőlegesen növelhető A sor típust a queue osztály valósítja meg, fontosabb műveletei: push: érték behelyezése a sor végére pop: első elem kivétele front: első elem lekérdezése back: utolsó elem lekérdezése size: méret lekérdezése empty: üres-e a sor PPKE ITK, Bevezetés a programozásba II 12:10

A sor Pl.: queue<int> intqueue; // üres verem létrehozása intqueue.push(-56); // elemek behelyezése intqueue.push(1); intqueue.push(130); intqueue.push(19); cout << intqueue.front() << endl; // eredmény: -56 cout << intqueue.back() << endl; // eredmény: 19 intqueue.pop(); // elemek kivétele intqueue.pop(); cout << intqueue.front() << endl; // eredmény: 130 PPKE ITK, Bevezetés a programozásba II 12:11

Példa Feladat: Készítsünk egy egyszerű sürgősségi betegellátó játékprogramot. a kórházba betegek érkeznek, mindegyik meggyógyítása adott időt vesz igénybe a gyógyítást orvosok végzik, akiket a sürgősségire külön kell behívni, és ezért külön fizetést kapnak (amíg bent vannak, és haza is lehet küldeni őket) a sürgősséginek adott költségvetése van, amely mindig fix összeggel bővül, és annak mindig pozitívban kell maradnia nem szabad, hogy a sürgősségit elárasszák a betegek, így mindig megfelelő orvosszámnak kell rendelkezésre állnia PPKE ITK, Bevezetés a programozásba II 12:12

Példa Tervezés: az alkalmazást grafikus felülettel látjuk el, és vezérlőkből alkotjuk meg információk kiírása címkét (Label), tevékenységre két gombot (Button) használunk, ezen felül az orvosok megjelenítésére új vezérlőket hozunk létre (DoctorDisplayWidget) a játékkal kapcsolatos információkat a saját alkalmazásban (MyApplication) helyezzük el (betegek, orvosok, játékidő, pénzmennyiség) a betegeket egy sor segítségével kezeljük (_patients) PPKE ITK, Bevezetés a programozásba II 12:13

Példa Tervezés: class Doctors Application MyApplication - _displaylabel :Label* - _doctordisplays :std::vector<doctordisplaywidget*> - _patients :std::queue<int> - _doctors :std::vector<int> - _gamebudget :int - _finance :int - _gametime :int - _gameover :bool + MyApplication(int) + ~MyApplication() # timertickaction() :void - adddoctoraction() :void - removedoctoraction() :void - changegamestate() :void - displaygamestate() :void -_doctordisplays DoctorDisplayWidget # _time :int Widget + DoctorDisplayWidget(int, int) + show() :void {query} + settime(int) :void PPKE ITK, Bevezetés a programozásba II 12:14

A lista A lista (list) egy olyan szekvenciális adatszerkezet, amely műveletek széles skáláját biztosítja bármely elemet, illetve több egymás utáni elemet módosíthatunk, törölhetünk, bármely elem elé, vagy után beszúrhatunk egy, vagy több új elemet az egyes elemek elérése nem indexeléssel, hanem bejáró (iterator) segítségével történik a lista egyes részeit kicserélhetjük, vagy kivehetjük másik listába, listákat összefűzhetünk egy közös listába az elemek sorrendjét megfordíthatjuk, vagy rendezhetjük a listát tetszőleges módon PPKE ITK, Bevezetés a programozásba II 12:15

A lista 8 15-7 iiiiiiiiiiii(iiii, 15) ppppppp_ffffffffff(8) -56 1 130 19 ppppppp_bbbbbbbb( 7) 8-56 15 1 130 19-7 bbbbbbbbbb + + eeeeee PPKE ITK, Bevezetés a programozásba II 12:16

A lista Pl.: list<int> intlist; intlist.push_back(10); // lista: 10 intlist.push_back(4); // lista: 10,4 intlist.push_front(-3); // lista: -3,10,4 intlist.pop_back(); // lista: -3,10 intlist.reverse(); // lista: 10, -3 list<int>::iterator it; // bejáró létrehozása for (it = intlist.begin(); it!= intlist.end(); it++){ cout << *it << endl; // elemek kiírása *it = 0; // elemek kinullázása } PPKE ITK, Bevezetés a programozásba II 12:17

A lista intlist.push_back(-4); // lista: 0,0,-4 intlist.unique(); // lista: 0,-4 intlist.sort(); // lista: -4,0 it = intlist.begin(); iter++; intlist.insert(iter, 5); // lista: -4,5,0 intlist.insert(iter, 2); // lista: -4,2,5,0 it--; intlist.erase(it); // lista: 2,5,0 // fordított bejárás: for (list<int>::reverse_iterator rit = intlist.rbegin(); rit!= intlist.rend(); rit++){ cout << *rit << endl; // elemek kiírása } PPKE ITK, Bevezetés a programozásba II 12:18

Az asszociatív tömb Az asszociatív tömb (map) egy olyan vektor, amelynek indexelése nem csupán a rögzített módon történhet (egész számok 0-tól), hanem tetszőleges típusú, és azon belül tetszőleges elemkombinációjú az indexeket kulcsoknak nevezzük, kulcs alapján kérdezhetünk le elemeket, illetve az alapján törölhetünk az elemeknek nincs sorrendje, és csak azokat a kulcsokat érhetjük el, amelyeket már behelyeztünk lekérdezhetjük az összes elemet bejáró (iterátor) segítségével, ekkor kulcs/érték pár mutatókat kapunk (a kulcs az első elem, az érték a második) PPKE ITK, Bevezetés a programozásba II 12:19

Az asszociatív tömb Az asszociatív tömböt a map osztály valósítja meg, műveletei: []: elem lekérdezése és írása find: keresés kulcs alapján insert: elem beszúrása a megadott helyre erase: elem törlése a megadott helyről swap: elemek kicserélése clear: lista kiürítése size: méret lekérdezése A bejáró a map::iterator típuson keresztül érhető el, és egy mutatót ad az elempárokra, ahol a kulcsot a first, az értéket a second attribútummal érhetjük el PPKE ITK, Bevezetés a programozásba II 12:20

Az asszociatív tömb Pl.: map<string, int> strmap; strmap["students"] = 67; // elemek felvétele strmap["teachers"] = 5; strmap["courses"] = 1; if (strmap.find("courses")) // kulcs keresése cout << strmap["courses"] << endl; // kiírja: 1 // bejárás: for (map<string, int>::iterator it = strmap.begin(); it!= strmap.end(); it++) cout << it->first << " => " << it->second << endl; // kiírja a kulcsot, majd az értéket PPKE ITK, Bevezetés a programozásba II 12:21