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

Hasonló dokumentumok
Fejlett programozási nyelvek C++ Iterátorok

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

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

Maximum kiválasztás tömbben

Bevezetés a programozásba 2

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

500. AA Megoldó Alfréd AA 500.

117. AA Megoldó Alfréd AA 117.

C++ Standard Template Library (STL)

1. Alapok. Programozás II

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

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

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

Bevezetés a programozásba. 9. Előadás: Rekordok

Programozás II gyakorlat. 8. Operátor túlterhelés

Bevezetés a programozásba I.

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

500. CC Megoldó Alfréd CC 500.

128. AA Megoldó Alfréd AA 128.

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

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

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

Bevezetés a programozásba I.

Programozási alapismeretek 2009/2010

Programozási alapismeretek 3. előadás

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

500.AJ Megoldó Magyar Magdolna 500.J

ISA szimulátor objektum-orientált modell (C++)

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

5. Gyakorlat. struct diak {

.AA Megoldó Alfréd AA.

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

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

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

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

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

Körkörös listák. fej. utolsó. utolsó. fej

Programozási tételek és C++

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

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

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

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

Programozási Nyelvek: C++

Számítógép és programozás 2

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

INFORMATIKA tétel 2019

4. Öröklődés. Programozás II

3. Osztályok II. Programozás II

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

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

Pénzügyi algoritmusok

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

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

Elemi alkalmazások fejlesztése II. 2. Beadandó feladat Juhász Ádám

503.AA Megoldo Arisztid 503.A

Challenge Accepted:C++ Standard Template Library

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

Programozás C++ -ban

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

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

Bevezetés a programozásba I.

500. DD Megoldó Alfréd DD 500.

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?

Programozás I gyakorlat. 10. Stringek, mutatók

Programozási technológia

C++ Gyakorlat jegyzet 10. óra.

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

1. Bevezetés A C++ nem objektumorientált újdonságai 3

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Programozás C++ -ban 2007/1

111. AA Megoldó Alfréd AA 111.

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

500.AA Megoldó Kulcsár 500.A

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

C++ Gyakorlat jegyzet 7. óra

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Programozás Minta programterv a 1. házi feladathoz 1.

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

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

A C programozási nyelv III. Pointerek és tömbök.

PROGRAMOZÁS tantárgy. Gregorics Tibor egyetemi docens ELTE Informatikai Kar

Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

Szerző Lővei Péter LOPSAAI.ELTE IP-08PAEG/25 Daiki Tennó

500.AA Megoldo Arisztid 500.A

Programozás II. 6.Öröklés Dr. Iványi Péter

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

A C programozási nyelv III. Pointerek és tömbök.

Programozás C és C++ -ban

1000.AA Megoldo Alfréd 1000.A

228. AA Default Konstruktor AA 228.

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

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.

A C# programozási nyelv alapjai

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

Átírás:

A C++ Standard Template Library rövid összefoglalás 2016-17. 1

Miről is van szó Alább összefoglaljuk, amely ismeretét feltesszük a félév során. Mivel mint megszokott az egyes verziók több-kevesebb mértékben eltérnek egymástól, ezért fontos megemlíteni, hogy a nyelv, amelyre teljesülnek az alábbiak az a c++ gcc v4.7.1 lesz. 2

STL alapfogalmak Konténerek (tárolók) Egyféle adatok tárolását lehetővé tevő adatsablonok (osztály-sablonok). Sablon: típussal (típusokkal) paraméterezve jön létre általa egy konkrét adatosztály, amely így már a memóriába képezhető, amely egy deklaráció során egy adathoz (általában változóhoz) rendelhető. A konténerek használati szintaxisa: Konténer<Típus>; jelentése Konténer=Típus*. Tehát a konténerek absztrakt értelemben mindig valami sorozatfélék. Minden konténerhez hozzárendeltek konténer-specifikus műveleteket. Az alábbiak (valamilyen néven) mindegyikhez tartozik: Hozzáad(K,e), ÜresE(K), Elemszám(K), ahol K:Konténer, e:típus. Egy típus definiálása a szokásos typedef utasítással végezhető el, utána a típusdeklaráció is a szokásos: typedef Konténer<Típus> TKonkrétKont; TKonkrétKont K;//K objektum/változó Például: typedef vector<int> TEgeszek; TEgeszek egeszek; Néhány nevezetes konténert felsorolunk: vector<típus> set<típus> map<típus> stack<típus> queue<típus> list<típus> dinamikus tömbök, halmazok, leképezések (kulcs érték párok halmaza), vermek, sorok, (kétirányú) listák. A konténerség érdekes folyománya a for alábbi kiterjesztett ciklusfajtája: for (Típus e:k) Hatására az e Típus típusú változó felveszi valamilyen sorrendben a K konténerben tárolt összes értéket, a ciklus lefutása során. Vagyis a ciklus hibátlan esetben annyiszor fog lefutni, ahány elemet tartalmaz a konténer Például: for (int x:egeszek) Iterátorok (felsorolók) Az iterátorok célja, hogy segítségükkel egy konténer elemeire hivatkozhassunk; hasonló, mint egy tömb indexének, csakhogy indexeléskor meg kell adni a tömböt és az indexet magát, addig az iterátor önmagában jelöli ki a hivatkozott elemet. Tehát az iterátor valójában egy pointer (egy memória-mutató). Minden konténer-elemeknek van egy belső ábrázolás meghatározta (a használó által általában nem ismert) sorrendisége, ahogy az elemek a memóriába elhelyezésre kerülnek. E belső logika szerinti elsőre a konténer.begin() utasítással hivatkozhatunk, az utolsó utánira pedig a konténer.end()-del. Egy i iterátor által meghatározott konténer elemre így hivatkozhatunk: (*i). Az indexelésnél gyakorta használt ++i operátor itt a következő elemre lépés értelemben hajtódik végre. Egy konténer elemeinek a feldolgozása hagyományos ciklusokkal is megszervezhető az előbb említett operátorok felhasználásával. 3

Például: for (TEgeszek::iterator i=egeszek.begin();i!=egeszek.end(); Ennek szemantikája hasonló a fent bemutatott kiterjesztett cikluséhoz. Algoritmusok Számos programozási tételt megfogalmaztak sablon formájában is, azaz típusokkal paraméterezett formában. Néhány nevezetes ezek közül: any_of(), find_if(), count_if(), max_element(), copy(), copy_if(). Találja ki a neve alapján, melyiknek mi lehet a célja, melyik melyik programozási tételt valósítja meg! Lássunk egy használati példát! int db=count_if(szamok.begin(),szamok.end(),parose); Itt a számok a szamok egy TEgeszek konténer, a parose pedig egy (tulajdonság-) függvény (int bool). A sablon definíciója az alábbi lehet: template <class InputIt,typename E> int count_if(inputit kezd, InputIt veg, bool T(E)) int db=0; while (kezd!=veg) if (T(*kezd)) ++db; ++kezd; return db; 4

Egy példa több módon megoldva A feladat Egy iskolában sokféle órát tartanak. Ismerjük az összes tanár nevét, és minden egyes órának néhány fontos jellemzőjét. Írjon programot az alábbi részfeladatok megoldására: a) Mennyi az egyes tanárok összóraszáma? b) Ki a legnagyobb óraszámú tárgyat tanító tanár? c) Milyen órái vannak egy adott osztály tanulóinak? d) Sorolja föl az iskolában tanított tantárgyakat! A tovább precíz feladatleírást lásd a Bíróban (Progalap Gyakorló / Tanórák)! Az alapmegoldás #include <iostream> #include <stdlib.h> using namespace std; const int MaxN=50; const int MaxT=30; ///bemeneti paraméterek: int N;///órák száma int T;///tanárok száma string OA;///osztálykód typedef string TNevek[MaxT+1]; TNevek tnk;///tanárok nevei typedef struct string targynev; int tankod; int oradb; string osztkod; TOra; typedef TOra TOrak[MaxN+1]; TOrak orak;///órák leírása ///kimeneti paraméterek: typedef int TTanDb[MaxT+1]; string B_maxTanNev; typedef string TTargyDb[MaxN+1]; int C_tDb; TTargyDb C_targyak; int D_tDb; TTargyDb D_targyak; void hiba(string uzenet, int megallasikod); void beolvasas(); int main() clog << "Orak feldolgozasa" << endl; beolvasas(); ///A) feladat: for (int i=1;i<=t; A_tanDb[i]=0; for (int i=1;i<=n; A_tanDb[orak[i].tanKod]+=orak[i].oraDb; for (int i=1;i<=t; cout << A_tanDb[i] << " "; cout << endl; 5

///B) feladat: int maxi=1; string B_maxTanNev=tNk[orak[1].tanKod]; for (int i=2;i<=n; if (orak[i].oradb>orak[maxi].oradb (orak[i].oradb==orak[maxi].oradb && B_maxTanNev>tNk[orak[i].tanKod])) maxi=i; B_maxTanNev=tNk[orak[i].tanKod]; cout << B_maxTanNev << endl; ///C) feladat: C_tDb=0; for (int i=1;i<=n; if (orak[i].osztkod==oa) C_targyak[++C_tDb]=orak[i].targyNev; cout << C_tDb; for (int i=1;i<=c_tdb; cout << ',' << C_targyak[i]; cout << endl; ///D) feladat: D_tDb=0; for (int i=1;i<=n; int j=1; while (j<=d_tdb && orak[i].targynev!=d_targyak[j]) ++j; if (j>d_tdb) D_targyak[++D_tDb]=orak[i].targyNev; cout << D_tDb; for (int i=1;i<=d_tdb; cout << ',' << D_targyak[i]; cout << endl; return 0; void hiba(string uzenet, int megallaskod) cerr << "\n" << uzenet << " (" << megallaskod << ")\n"; exit(megallaskod); void beolvasas() clog << "Orak szama/tanarok szama/osztalykod:"; cin >> N; if (cin.fail() cin.peek()!=' ' N<1 N>MaxN) hiba("hibas oraszam!",11); cin >> T; if (cin.fail() cin.peek()!=' ' T<1 T>MaxT) hiba("hibas tanarszam!",12); cin >> OA; if (OA.size()==0) hiba("hibas osztalykod!",13); string tmp; getline(cin,tmp);//sorvégjel megevése 6

for (int i=1;i<=t; clog << i << ". tanar neve:"; getline(cin,tnk[i]); if (tnk[i].size()==0) hiba("hibas tanarnev!",20+i); for (int i=1;i<=n; clog << i << ". targynev:"; getline(cin,orak[i].targynev); if (orak[i].targynev.size()==0) hiba("hibas targynev!",maxt+20+i); clog << i << ". tanarkod:"; cin >> orak[i].tankod; if (cin.fail() cin.peek()!='\n' orak[i].tankod<1 orak[i].tankod>t) hiba("hibas tanarkod!",maxt+20+i); string tmp; getline(cin,tmp);//sorvégjel megevése clog << i << ". oraszam:"; cin >> orak[i].oradb; if (cin.fail() cin.peek()!='\n' orak[i].oradb<1 orak[i].oradb>9) hiba("hibas oraszam!",maxt+20+i); getline(cin,tmp);//sorvégjel megevése clog << i << ". osztalykod:"; getline(cin,orak[i].osztkod); if (orak[i].osztkod.size()==0) hiba("hibas osztalykod!",maxt+20+i); Egy STL-alapú megoldás #include <iostream> #include <stdlib.h> #include <vector>///vector-hoz #include <map> ///leképezéshez, asszociatív tömbhöz #include <set> ///halmazhoz using namespace std; const int MaxN=50; const int MaxT=30; ///bemeneti paraméterek: int N;///órák száma int T;///tanárok száma string OA;///osztálykód typedef vector<string> TNevek; TNevek tnk;///tanárok nevei typedef struct string targynev; int tankod; int oradb; string osztkod; TOra; typedef vector<tora> TOrak; TOrak orak;///órák leírása ///kimeneti paraméterek: typedef map<string,int> TTanDb; string B_maxTanNev; typedef vector<string> TTargyak; int C_tDb; TTargyak C_targyak; typedef set<string> TTargyHalmaz; int D_tDb; TTargyHalmaz D_targyak; void hiba(string uzenet, int megallasikod); void beolvasas(); 7

int main() clog << "Orak feldolgozasa" << endl; beolvasas(); ///A) feladat: for (TNevek::iterator i=tnk.begin();i!=tnk.end(); A_tanDb[*i]=0; for (TOrak::iterator i=orak.begin();i!=orak.end(); /*i=orak vector egy eleme*/ A_tanDb.at(tNk.at((*i).tanKod-1))+=(*i).oraDb; for (TNevek::iterator i=tnk.begin();i!=tnk.end(); cout << A_tanDb.at(*i) << " "; cout << endl; ///B) feladat: TOrak::iterator maxi=orak.begin(); B_maxTanNev=tNk[(*maxI).tanKod-1]; for (TOrak::iterator i=orak.begin();i!=orak.end(); ///ha 1-elemü, akkor ++orak.begin()-en elszáll if ((*i).oradb>(*maxi).oradb ((*i).oradb==(*maxi).oradb && B_maxTanNev>tNk[(*i).tanKod-1])) maxi=i; B_maxTanNev=tNk[(*i).tanKod-1]; cout << B_maxTanNev << endl; ///C) feladat: for (TOrak::iterator i=orak.begin();i!=orak.end(); if ((*i).osztkod==oa) C_targyak.push_back((*i).targyNev); C_tDb=C_targyak.size(); cout << C_tDb; for (TTargyak::iterator i=c_targyak.begin();i!=c_targyak.end(); cout << ',' << *i; cout << endl; ///D) feladat: for (TOrak::iterator i=orak.begin();i!=orak.end(); D_targyak.insert((*i).targyNev); D_tDb=D_targyak.size(); cout << D_tDb; for (TTargyHalmaz::iterator i=d_targyak.begin();i!=d_targyak.end(); cout << ',' << *i; cout << endl; return 0; void hiba(string uzenet, int megallaskod) cerr << "\n" << uzenet << " (" << megallaskod << ")\n"; exit(megallaskod); void beolvasas() clog << "Orak szama/tanarok szama/osztalykod:"; cin >> N; if (cin.fail() cin.peek()!=' ' N<1 N>MaxN) hiba("hibas oraszam!",11); cin >> T; 8

if (cin.fail() cin.peek()!=' ' T<1 T>MaxT) hiba("hibas tanarszam!",12); cin >> OA; if (OA.size()==0) hiba("hibas osztalykod!",13); string tmp; getline(cin,tmp);///sorvégjel megevése for (int i=1;i<=t; clog << i << ". tanar neve:"; getline(cin,tmp); tnk.push_back(tmp);///tnk végéhez illesztjük az új nevet if (tnk.back().size()==0) hiba("hibas tanarnev!",20+i); clog << " \"" << tnk.back() << "\" " << endl; for (int i=1;i<=n; TOra ora; clog << i << ". targynev:"; getline(cin,ora.targynev); if (ora.targynev.size()==0) hiba("hibas targynev!",maxt+20+i); clog << i << ". tanarkod:"; cin >> ora.tankod; if (cin.fail() cin.peek()!='\n' ora.tankod<1 ora.tankod>t) hiba("hibas tanarkod!",maxt+20+i); string tmp; getline(cin,tmp);///sorvégjel megevése clog << i << ". oraszam:"; cin >> ora.oradb; if (cin.fail() cin.peek()!='\n' ora.oradb<1 ora.oradb>9) hiba("hibas oraszam!",maxt+20+i); getline(cin,tmp);///sorvégjel megevése clog << i << ". osztalykod:"; getline(cin,ora.osztkod); if (ora.osztkod.size()==0) hiba("hibas osztalykod!",maxt+20+i); orak.push_back(ora);///orak végéhez illesztjük az új órát 9

Összefoglalás tapasztalatok A hagyományosról az STL-stílusú kódra áttérés mechanikus módját foglaljuk össze a kétféle megoldást összevetésével. Alábbiakban néhány példapár segítségével mutatunk be egy lehetőséget: Hagyományos C++ megoldás const int MaxN=50; typedef string TNevek[MaxT+1]; typedef int TTanDb[MaxT+1]; STL-stílusú megoldás typedef vector<string> TNevek; typedef map<string,int> TTanDb; for (int i=1;i<=t; clog << i << ". tanar neve:"; getline(cin,tnk[i]); if (tnk[i].size()==0) hiba("hibas tanarnev!",20+i); for (int i=1;i<=t; clog << i << ". tanar neve:"; getline(cin,tmp); tnk.push_back(tmp); if (tnk.back().size()==0) hiba("hibas tanarnev!",20+i); for (int i=1; i<=t; A_tanDb[tNk[orak[i].tanKod]]=0; for (int i=1; i<=n; A_tanDb[tNk[orak[i].tanKod]]+= orak[i].oradb; const int MaxT=30; typedef string TTargyDb[MaxN+1]; int D_tDb; TTargyDb D_targyak; for (TNevek::iterator i=tnk.begin(); i!=tnk.end(); A_tanDb[*i]=0; for (TOrak::iterator i=orak.begin(); i!=orak.end(); A_tanDb.at(tNk.at((*i).tanKod-1))+= (*i).oradb; typedef set<string> TTargyHalmaz; int D_tDb; TTargyHalmaz D_targyak; D_tDb=0; for (int i=1; i<=n; int j=1; while (j<=d_tdb && orak[i].targynev!= D_targyak[j]) ++j; if (j>d_tdb) D_targyak[++D_tDb]= orak[i].targynev; for (TOrak::iterator i=orak.begin(); i!=orak.end(); D_targyak.insert((*i).targyNev); D_tDb=D_targyak.size(); 10

11