Programozás alapjai II. (11. ea) C++ STL algoritmusok

Hasonló dokumentumok
Előző óra összefoglalása. Programozás alapjai II. (11. ea) C++ STL algoritmusok. Létrehozás/megsemm. példa. STL tárolók összefoglalása

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

C++11 TÓTH BERTALAN C++ PROGRAMOZÁS STL KONTÉNEREKKEL

Fejlett programozási nyelvek C++ Iterátorok

Bevezetés a programozásba 2

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

Programozás alapjai II. (13. ea) C++ Év végi összefoglalás

Programozás alapjai II. (13. ea) C++ Év végi összefoglalás

C++ Standard Template Library (STL)

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

500. CC Megoldó Alfréd CC 500.

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

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.

C++ Standard Template Library

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

117. AA Megoldó Alfréd AA 117.

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

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?

Standard Template Library. Adatstruktúrák és algoritmusok a C++ nyelvhez

500. AA Megoldó Alfréd AA 500.

500. DD Megoldó Alfréd DD 500.

Programozás alapjai II. (8. ea) C++ bejárók és egy tervezési példa

228. AA Default Konstruktor AA 228.

Pénzügyi algoritmusok

Challenge Accepted:C++ Standard Template Library

500.AJ Megoldó Magyar Magdolna 500.J

500.AA Megoldó Kulcsár 500.A

128. AA Megoldó Alfréd AA 128.

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

500.AA Megoldo Arisztid 500.A

Generikus Típusok, Kollekciók

1000.AA Megoldo Alfréd 1000.A

feladat pont min elért

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

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

3. Osztályok II. Programozás II

1.AA MEGOLDÓ BERCI AA 1.

Collections. Összetett adatstruktúrák

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

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

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

feladat pont min elért

S02-3 Multiparadigma programozás és Haladó Java 2

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

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

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.

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

C++ Gyakorlat jegyzet 10. óra.

.AA Megoldó Alfréd AA.

503.AA Megoldo Arisztid 503.A

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

Programozás C++ -ban 2007/4

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

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

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

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

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

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

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

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

Felhasználó által definiált adattípus

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

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

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

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

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Pénzügyi algoritmusok

Programozás C++ -ban

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

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

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

Programozás alapjai II. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Java és web programozás

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

OOP #14 (referencia-elv)

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

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

Programozási technológia

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

C++ programozási nyelv Konstruktorok-destruktorok

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

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

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

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

Programozás alapjai II. (2. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Imperatív programozás

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Kalapácsvetés 2016 szöveges

Nyolc királynő probléma. Programozás alapjai II. (13. ea) C++ visszalépéses (backtrack) algoritmusok táblás játékok, összefoglalás.

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

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

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

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

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

#include <iostream> using namespace std; // struct macska is lehetne class macska { public: int kor; int suly; }; void main() { macska cirmi;

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

Átírás:

Programozás alapjai II. (11. ea) C++ STL algoritmusok Szeberényi Imre BME IIT <szebi@iit.bme.hu> M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 1 -

Előző óra összefoglalása Kivételkezelés működés részletei, hatása az objektumok élettartamára Konstruktorban, destruktorban Létrehozás/megsemmisítés működésének felhasználása (auto_ptr, fájlkezelés) STL bevezető (tárolók) C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 2 -

STL tárolók összefoglalása/2 A tárolók másolatot tárolnak! Valami v1, v2, vp; std::vector<valami> vvec; vvec.push_back(v1);// lemásolódott, a másolatot tárolja vvec.pop_back(v1); // másolat megszűnt DE vp = new Valami; std::vector<valami*> vpvec; Valami vpvec.push_back(vp);// a másolat is erre hivatkozik vpvec.pop_back(vp);// a második hivatkozás megszűnt Fontos, kérdés hogy ki és mikor szabadít fel? vpvec.push_back(new Valami); // Mem.leak!!! C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 3 -

STL tárolók összefoglalása/3 Két fajta STL tároló van: Sorozat tárolók (vector, list, deque) A programozó határozza meg a sorrendet: Asszociatív tárolók (set, multiset, map, multimap) A tároló határozza meg a tárolt sorrendet Ez elemek egy kulccsal érhetők el. C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 4 -

STL tárolók összefoglalása /3 vector<t, Alloc> list<t, Alloc> deque<t, Alloc> map<key, T, Cmp, Alloc> set<key, Cmp, Alloc> stack<t, deque> queue<t, deque> priority_queue<t, vector, Cmp> C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 5 -

Tárolók fontosabb műveletei Konstr. destr. op= Iterátoro k s i z e m a x _ s i z e e m p t y r e s i z e fr o n t vector + + + + + + + + + + + + + + + + + deque + + + + + + + + + + + + + + + + + + + b a c k list + + + + + + + + + + + + + + + + + set + + + + + + + + + multiset + + + + + + + + + map + + + + + + + + + + multimap + + + + + + + + + o p [] a t a s s i g n i n s e rt e r a s e s w a p c l e a r p u s h _ fr o n t p o p _ fr o n t p u s h _ b a c k p o p _ b a c k C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 6 -

Ma STL algoritmusok Korábbi példa továbbfejlesztése STL tároló használata STL iterátor használata Egy tipikus viselkedési minta és megvalósítása Observer Egy tipikus obj. struktúra és megvalósítása Adapter C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 7 -

Algoritmusok <algorithm> Nem módosító sorozatműveletek Sorozatmódosító műveletek Rendezés, rendezett sorozatok műveletei Halmazműveletek Kupacműveletek Mimimum, maximum Permutációk C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 8 -

Nem módosító műv. for_each(fisrt, last, fn) find(fisrt, last, val), find_if(fisrt, last, un_pred) find_end(f1, l1, f2, l2, un_pred), find_first_of(f1, l1, f2, l2, un_pred), adjacent_find(fisrt, last, bin_pred) count(fisrt, last) count_if(fisrt, last, un_pred) mismatch(f1, l1, f2, l2, bin_pred) // ret: pair equal(f1, l1, l2, bin_pred) search(f1, l1, f2, l2, bin_pred) search_n(f, l, count, val, bin_pred) C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 9 -

1. Példa: count_if template <class InpIterator, class UnPredicate > prtdiff_t count_if(inpiterator first, InpIterator last, UnPredicate pred ) { prtdiff_t ret = 0; while (first!= last) if (pred(*first++)) ++ret; return ret; } int v[] = {11, 2, 3, 32, 21, 15} ; bool IsOdd(int i) { return ((i%2)==1); } cout << count_if (v, v+6, IsOdd); // az int* is iterator! C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 10 -

2. Példa: adjacent_find template <class FwIterator, class BinPredicate > FwIterator adjacent_find(fwiterator first, FwIterator last, BinPredicate pred ) { if (first!= last) { FwIterator next=first; ++next; while (next!= last) if (pred(*first++, *next++)) return first; } return last; } C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 11 -

3. Példa: mismatch template <class Iter1, class Iter2, class BinPred> pair<iter1, Iter2> mismatch(iter1 first1, Iter1 last1, Iter2 first2, BinPred pred) { while (first1!= last1) { if (!pred(*first1,*first2)) break; ++first1; ++first2; } return make_pair(first1, first2); } C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 12 -

Sorozat módosító műv. copy() copy_backward() swap(), iter_swap() swap_ranges() replace() replace_if() replace_copy() replace_copy_if() fill(), fill_n() generate() generate_n() partition() stable_partition() remove() remove_if() remove_copy() remove_copy_if() unique() unique_copy_if() reverse() reverse_copy() rotate(), rotate_copy() random_shuffle() transform() C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 13 -

Rendezés, rend.sor. műv., halmaz sort(), stable_sort(), partial_sort() partial_sort_copy() nth_element() lower_bound(), upper_bound() equal_range() binary_search() merge() inplace_merge() includes() set_union(), set_intersection(), set_difference() set_symmetric_difference() C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 14 -

Kupac, min, max, permut. make_heap() push_heap() pop_heap() sort_heap() min(), max() min_element(), max_element() lexicographical_compare() next_permutation() prev_permutation() C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 15 -

4. példa int v[] = {10,20,30,30,20,10,10,20}; int *ip = adjacent_find (v, v+8); // a pointer is iterator! vector<int> iv(v, v+8); vector<int>::iterator it; it = adjacent_find(iv.begin(), iv.end()); // első ismétlődés it = adjacent_find(++it, iv.end()); // második ism. it = adjacent_find(iv.begin(), iv.end(), greater<int>()); predikátum C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 16 -

Függvényobjektumok <functional> unary_function, binary_function template <class Arg, class Result> struct unary_function { typedef Arg argument_type; typedef Result result_type; }; struct Valami : public unary_function<int, bool> {... };... Valami::argument_type... Valami::result_type...... C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 17 -

Predikátumok és aritm. műv. equal_to, not_equal_to, greater, less, greater_equal, less_equal logical_and, logical_or logical_not plus minus multiplies divides modulus negate C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 18 -

Lekötők, átalakítók, típusok bind2nd() bind1st() mem_fun() mem_fun_ref() prt_fun() not1() not2() binder1st binder2nd mem_fun1_ref_t mem_fun1_t mem_fun_ref_t mem_fun_t unary_negate binary_negate C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 19 -

5. példa int v[] = {10,20,30,30,20,10,10,20}; predikátum cout << count_if(v, v+8, bind2nd(less<int>(), 11)); lekötő hasonlító függvény C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 20 -

6. példa bool odd(int i) { return i&1; }... int v[] = {10,20,15,35,92}; vector<int> iv(v, v+5); make_heap(iv.begin(), iv.end()); Print(iv); // 92, 35, 15, 10, 20, sort_heap(iv.begin(), iv.end()); Print(iv); // 10, 15, 20, 35, 92, Print template vector<int>::iterator it = remove_if(iv.begin(), iv.end(), odd); iv.erase(it, iv.end()); Print(iv); // 10, 20, 92, C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 21 -

7. példa int pow(int i) { return i*i; }... int v[] = {1,2,5,7,10}; vector<int> iv(v, v+5); transform(iv.begin(), iv.end(), iv.begin(), pow); Print(iv); // 1, 4, 25, 49, 100, iv.pop_back(); iv.pop_back(); do { Print(iv); 1, 4, 25, 1, 25, 4, 4, 1, 25, 4, 25, 1, 25, 1, 4, 25, 4, 1, } while (next_permutation(iv.begin(), iv.end())); C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 22 -

8. példa: Szavak gyakorisága // Szavakat olvasunk, de eldobjuk a számjegyeket bool isdigit(char ch) { return isdigit(ch)!= 0; } map<string, int> szamlalo; string szo; while (cin >> szo) { string::iterator vege = remove_if(szo.begin(), szo.end(), isdigit); szo.erase(vege, szo.end()); if (!szo.empty()) szamlalo[szo] += 1; } C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 23 -

Szavak gyakorisága /2 // Kiírjuk a szavakat és az előfordulási számot. // Betesszük egy vektorba a szavakat. // A map miatt rendezett. vector<string> szavak; cout << "Szavak gyakorisaga:" << endl; for (map<string, int>::iterator it = szamlalo.begin(); it!= szamlalo.end(); it++) { cout << it->first << ": " << it->second << endl; szavak.push_back(it->first); } C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 24 -

Szavak gyakorisága /3 // Kiírjuk a szavakat a vektorból. // És fordítva is lerendezzük. cout << "Szavak rendezve:" << endl; ostream_iterator<string> out_it(cout, ","); copy(szavak.begin(), szavak.end(), out_it); cout << endl << "Szavak forditva:" << endl; sort(szavak.begin(), szavak.end(), greater<string>()); copy(szavak.begin(), szavak.end(), out_it); C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 25 -

Cápali és Cápeti C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. 2011.04.26. - 26 -

Feladat Egészítsük ki a korábbi modellünket: Az állatvédők tudni akarják, hogy mekkora utat tesz meg élete során Cápeti, a cápa. A tengerbiológusok tudni akarják, hogy hányszor szaporodik Cápeti. A dokumentum film készül Cápeti útjáról. Kérdések: Tegyünk 3 jeladót Cápeti nyakába? 1 jeladó jelezzen mindenkinek? C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 27 -

Observer terv. minta Observer -subjptr +update( ) Subject -obsptr[] +attach() +detach() +notify() ConcreteObs1 +update( ) ConcreteObs2 +update( ) ConcreteSubj C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 28 -

Subject osztály class Subject { set<observer*> obs; // observerek pointere public: void attach(observer* os); void detach(observer* os); void notify(int reason); virtual ~Subject(); }; C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 29 -

Observer osztály class Observer { Subject *subj; // megfigyelt objektum public: Observer(Subject* subj); virtual void update(subject* subj, int reason); virtual ~Observer(); }; C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 30 -

Subject tagfüggvényei /1 void Subject::attach(Observer *o) { obs.insert(o); } void Subject::detach(Observer *o) { obs.erase(obs.find(o)); } Subject::~Subject() { notify(0); // jelzi, hogy megszűnt } C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 31 -

Subject tagfüggvényei /2 // minden figyelőt értesít a változásról void Subject::notify(int reason) { for (std::set<observer*>::iterator it = obs.begin(); it!= obs.end(); it++ ) (*it)->update(this, reason); } C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 32 -

Observer tagfüggvényei Observer::Observer(Subject *subj) :subj(subj){ subj->attach(this); } void Observer::update(Subject* subj, int reason) { if (reason == 0) this->subj = 0; // megszűnt: nem figyeli } Observer::~Observer() { if (subj!= 0) // van még kit figyelni? subj->detach(this); } C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 33 -

Figyelt cápa class FigyeltCapa :public Capa, public Subject { Koord lastpos; public: Koord getpos() const { return lastpos; } void lep(koord pos, Ocean& oc, int it); }; C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 34 -

Cápa figyelő class CapaFigyelo : public Observer {... public: CapaFigyelo(FigyeltCapa *fc); int getkor() const; int getehes() const; void update(subject *subj, int oka); void ut(std::ostream& os); }; C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 35 -

Figyelés indítása FigyeltCapa *capeti = new FigyeltCapa; CapaFigyelo mester(capeti); CapaFigyelo filmes(capeti); CapaFigyelo biologus(capeti);. C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 36 -

Adaptáció: delegáció vs. öröklés Feladat készítsünk Stack-et építsünk az stl::vector-a műveletek: push, pop, top vektorban nagyon hasonló metódusok C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 37 -

Adaptáció: delegáció vs. öröklés 1. megoldás: öröklés stack a vector leszármazottja sok minden készen van de túl sok mindent "lát" publikus vs. privát öröklés Művelet megvalósítása pl: void push(t t) { this->push_back(t); } C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 38 -

Adaptáció: delegáció vs. öröklés 2. megoldás: delegáció vector a stack egy aggregátuma csak publikus tagokat lát a vector lecserélhető minden függvényhez kell egy delegáló tagfüggvény. Pl: void push(t t) { v.push_back(t); } C++ programozási nyelv BME-IIT Sz.I. 2015.04.21. - 39 -