C++ Standard Template Library (STL)

Hasonló dokumentumok
Challenge Accepted:C++ Standard Template Library

Fejlett programozási nyelvek C++ Iterátorok

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

C++ Gyakorlat jegyzet 9. óra

C++ Gyakorlat jegyzet 10. óra

C++ Gyakorlat jegyzet 10. óra.

C++ Standard Template Library

Tartalom. Bevezetés. Referenciák. Objektum-orientált programozás. Sablonok. Standard Template Library. Template Metaprogramozás. C++0x.

1000.AA Megoldo Alfréd 1000.A

1.AA MEGOLDÓ BERCI AA 1.

500.AA Megoldó Kulcsár 500.A

500.AA Megoldo Arisztid 500.A

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.

Bevezetés a programozásba 2

.AA Megoldó Alfréd AA.

503.AA Megoldo Arisztid 503.A

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

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

500.AJ Megoldó Magyar Magdolna 500.J

500. DD Megoldó Alfréd DD 500.

Alprogramok, paraméterátadás

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

feladat pont min elért

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?

C++ Gyakorlat jegyzet 12. óra

C++ Gyakorlat jegyzet 8. óra

500. CC Megoldó Alfréd CC 500.

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

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

500. AA Megoldó Alfréd AA 500.

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

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

Generatı v programok helyesse ge

128. AA Megoldó Alfréd AA 128.

C++ Gyakorlat jegyzet 7. óra

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

1. Alapok. Programozás II

A C++11 újdonságai. Smidla József Operációkutatási Laboratórium október 9.

Bevezetés a programozásba I.

117. AA Megoldó Alfréd AA 117.

Programozási Nyelvek: C++

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

feladat pont min elért

3. Osztályok II. Programozás II

Programozási Nyelvek (C++) Összefoglaló

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

Programozási technológia

228. AA Default Konstruktor AA 228.

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

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

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

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

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

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

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

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

A C++ PROGRAMOZÁSI NYELV ISMERETÉNEK SZÁMONKÉRÉSE

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Tervminták II. (Híd, Bejáró, Gyártófüggvény) Halmaz és bejárása Osztály-sablonok

Programozás C és C++ -ban

Programozás alapjai. 5. előadá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.

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

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

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

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

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

Kivételek, kivételkezelés a C++ nyelvben

GTL Graphical Template Library

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

Dinamikus láncolt lista 4. GYAKORLAT

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

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

Generikus Típusok, Kollekciók

Katona József Király Zoltán. Objektumorientált szoftverfejlesztés C++ nyelven

Programozás módszertan

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

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

Fejlett programozási nyelvek C++

OOP: Java 4.Gy: Java osztályok

111. AA Megoldó Alfréd AA 111.

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

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

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

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

Memóriakezelés, dinamikus memóriakezelés

Collections. Összetett adatstruktúrák

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

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

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

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

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

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. (7. ea) C++

Tervminták a valósidejű gyakorlatban

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

Cekla. Készítette Doxygen Tue Sep :13:44

C#, OOP. Osztályok tervezése C#-ban

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

Átírás:

Programozási Nyelvek és Fordítóprogramok Tanszék Programozási Nyelvek I.

Témák 1 STL alapok 2 STL fogalmak 3 Konténerek 4 Iterátorok 5 Funktorok

C++ STL Ne fedezzük fel újra spanyolviaszt! Sok adatszerkezet/algoritmus implementált a könyvtárban Hatékonyság C-s alapok + C++ operátor túlterhelések + C++ template-ek További lehetőségek a template-ekkel kapcsolatban

C: find int* find( int* first, int* last, int i ) while( first!= last ) if ( *first == i ) return first; ++first; return 0;

Template? Template :-) template <class T> T* find( T* first, T* last, const T& t ) while( first!= last ) if ( *first == t ) return first; ++first; return 0;

Még több template paraméter? Nyilván :-) template <class It, class T> It find( It first, It last, const T& t ) while( first!= last ) if ( *first == t ) return first; ++first; return last;

STL alapfogalmak Szabvány és implementációk (HP STL, SGI STL, Dinkumware, stb.) Aszimptotikus műveletigény garanciák Szabványos azonosítók Online referenciák Fő komponensek: Konténerek (pl. vector) Algoritmusok (pl. for_each) Iterátorok (pl. list<int>::iterator) Funktorok (Felhasználói osztályok operator()-ral.) Stb.

Az STL bővítése Új algoritmusok: működnek a meglévő konténerekkel Új konténerek: működnek a meglévő algoritmusokkal Nem kell módosítani a könyvtár kódját Párhuzamos bővítés, OOP limitációk

Fejállományok Lényegében header-only implementáció Algoritmusok: #include <algorithm> #include <numeric> Konténerek: #include <vector> #include <list> #include <deque> #include <string> #include <set> #include <map> Hasznos holmik: #include <functional> #include <utility>

Fejállományok Include-oljuk azt, amelyikre ténylegesen szükségünk van! Ne include-oljuk feleslegesen! Include-oljuk azt, amelyikre ténylegesen szükségünk van! Akkor is, ha lefordul anélkül... Hordozhatósági problémák

Konténerek az STL-ben Szekvenciális konténerek: vector list deque string Asszociatív konténerek: set, multiset map, multimap

Szekvenciális konténerek Eltérő memória felhasználás Hasonló műveletek: size push_back pop_back push_front pop_front indexelés insert stb. Jelentős különbségek

Asszociatív konténerek Rendezettség Jellemzően piros-fekete fák Műveletigények Speciális tagfüggvények Ekvivalencia, egyenlőség

Példa map #include <iostream> #include <map> #include <string> int main() std::map<std::string, std::string> phones; phones[ "Kiss Bertalan" ] = "555-1234"; phones[ "Nagy Kunigunda" ] = "555-6666"; std::cout << phones[ "Kiss Bertalan" ] << std::endl; std::cout << phones[ "Unknown" ] << std::endl; std::cout << phones.size() << std::endl;

Rendezések az STL-ben std::set<int> si; si.insert( 7 ); si.insert( 2 ); si.insert( 8 ); si.insert( 3 ); std::copy( si.begin(), si.end(), std::ostream_iterator<int>( std::cout, " " ) ); // 2 3 7 8

Példa multiset class Employee std::string name; int salary; public: //... const std::string& get_name() const return name; ;

Rendezések az STL-ben struct EmployeeComp ; bool operator()( const Employee& lhs, const Employee& rhs ) const return lhs.get_name() < rhs.get_name();

Rendezések az STL-ben std::multiset<employee, EmployeeComp> employees; Employee e(...); employees.insert( e ); std::multiset<employee, EmployeeComp>::iterator i = employees.begin(); std::cout << i->get_name() << std::endl;

Alapértelmezett rendezések megvalósítása #include <functional> //... template <class Key, class Comp = std::less<key>, /*... */ > class set //... ;

Paraméterezett rendezések használata template <class Key, class Comp = std::less<key> > class set //... void foo() Key a(...); Key b(...); if ( Comp()( a, b ) ) // "a < b" //... ;

Speciális konstruktorok std::multiset<int> m( std::istream_iterator<int>( std::cin ), std::istream_iterator<int>( ) ); std::copy( m.begin(), m.end(), std::ostream_iterator<int>( std::cout, " " ) ); std::deque<int> d( m.begin(), m.end() );

Intervallum konstruktorok megvalósítása template <class T, /*...*/> class deque //... public: template <class InputIterator> deque( InputIterator first, InputIterator last ) //... ;

vector std::vector<int> v; v.push_back( 4 ); int *ip = &v[ 0 ];

vector std::vector<bool> x; x.push_back( false ); bool* p = &x[ 0 ];

Hibaüzenet

A jelenség mögötti fogalom Template specializáció (template osztály): Parciális specializáció Teljes specializáció A vector<bool> egy önálló konténer Template metaprogramozás

Iterátorok C-ben: pointerek a tömbök bejárásához C++ STL: iterátorok a konténerek bejárásához Konténerek indexelés nélkül szintén bejárható (pl. list) Konténerek belső típusa begin() és end() Iterátor kategóriák a konténerek esetében Példák: #include <list> #include <vector> //... std::vector<int> v; std::vector<int>::iterator i = v.begin(); std::list<double> d; std::list<double>::iterator s = d.begin();

Példa find std::list<int> c; int s; //... std::list<int>::iterator i = std::find( c.begin(), c.end(), s ); if ( c.end()!= i ) std::cout << *i;

Példa find std::deque<int> d; int x; //... std::deque<int>::iterator i = std::find( d.begin(), d.end(), x ); if ( c.end()!= i ) std::cout << *i;

Konténerek bejárása std::set<int> m; //... for( std::set<int>::iterator i = m.begin(); i!= m.end(); ++i ) if ( 0 == *i % 2 ) std::cout << *i << ;

Példa map #include <map> //... typedef std::map<std::string, std::string> dict; //... dict phones; phones[ "Kiss Bertalan" ] = "555-1234"; //... for( dict::iterator it = phones.begin(); it!= phones.end(); ++it ) std::cout << it->first << ":" << it->second << std::endl;

Iterátor kategóriák Input iterator Output iterator Forward iterator Bidirectional iterator Random access iterator

Felhasználói kódrészletek Gyakran kell felhasználói kódrészletet átadni az STL-nek Rendezések (pl. std::sort, asszociatív konténerek) Keresések (pl. std::find_if, count_if algoritmusok) std::for_each algoritmus stb. Hatékonyság, paraméterezhetőség operator() tetszőleges aritás

Példa class Sum double ps; public: Sum( double d = 0.0 ) : ps( d ) void operator()( double d ) ps += d; double get() const return ps; ;

Példa std::deque<double> d; //... std::cout << std::for_each( d.begin(), d.end(), Sum() ).get();

Példa std::set<double> s; //... std::cout << std::for_each( s.begin(), s.end(), Sum( 3.14 ) ).get();