C++ Standard Template Library

Hasonló dokumentumok
C++ Standard Template Library (STL)

Fejlett programozási nyelvek C++ Iterátorok

Challenge Accepted:C++ Standard Template Library

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

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

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

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

Bevezetés a programozásba 2

C++ Gyakorlat jegyzet 10. óra

Generikus Típusok, Kollekciók

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

1.AA MEGOLDÓ BERCI AA 1.

500.AA Megoldó Kulcsár 500.A

C++ Gyakorlat jegyzet 10. óra.

1000.AA Megoldo Alfréd 1000.A

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

500.AA Megoldo Arisztid 500.A

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

500. AA Megoldó Alfréd AA 500.

Pénzügyi algoritmusok

Fejlett programozási nyelvek C++

Alprogramok, paraméterátadás

500. CC Megoldó Alfréd CC 500.

Generatı v programok helyesse ge

503.AA Megoldo Arisztid 503.A

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

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

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++ Standard Template Library rövid összefoglalás

C++ Gyakorlat jegyzet 9. óra

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 II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

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

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

OOP #14 (referencia-elv)

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

Bevezetés a programozásba Előadás: A const

500.AJ Megoldó Magyar Magdolna 500.J

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) {} };

Programozási Nyelvek: C++

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

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

3. Osztályok II. Programozás II

117. AA Megoldó Alfréd AA 117.

Apple Swift kurzus 3. gyakorlat

Programozás II gyakorlat. 6. Polimorfizmus

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

Collections. Összetett adatstruktúrák

feladat pont min elért

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

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

Informatika terméktervezőknek

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

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

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

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

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

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

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

Dinamikus láncolt lista 4. GYAKORLAT

Programozási technológia

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

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

.AA Megoldó Alfréd AA.

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

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

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.

128. AA Megoldó Alfréd AA 128.

C++ programozási nyelv Konstruktorok-destruktorok

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

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

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

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

500. DD Megoldó Alfréd DD 500.

1. Alapok. Programozás II

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

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

C++ Gyakorlat jegyzet 7. óra

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

és az instanceof operátor

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

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

Pénzügyi algoritmusok

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Bevezetés a programozásba I.

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

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1.

PHP alapjai, bevezetés. Vincze Dávid Miskolci Egyetem, IIT

C++ Gyakorlat jegyzet 12. óra

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

C++ Gyakorlat jegyzet 8. óra

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

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

Szoftvertechnolo gia gyakorlat

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

Programozás alapjai. 5. előadás

Programozás módszertan

228. AA Default Konstruktor AA 228.

Programozás C++ -ban 2007/7

Átírás:

Haladó C++, 1/ 78 C++ Standard Template Library Pataki Norbert 2014. április 2.

Haladó C++, 2/ 78 Generic programming, generikus programozás Expression problem OOP vs. generic programming Párhuzamos bővíthetőség Lifting abstraction

Haladó C++, 3/ 78 C++ Standard Template Library Konténerek Algoritmusok Iterátorok Átalakítók Funktorok Allokátorok

Haladó C++, 4/ 78 Iterátor invalidáció std::vector<double> v; std::multiset<int> s; std::list<std::string> ls; //... std::vector<double>::iterator i = v.begin(); std::multiset<int>::const_iterator ci = s.begin(); std::list<std::string>::iterator li = ls.begin(); Meddig hivatkozik az iterátor az ottlévő elemre? Meddig hivatkozik az iterátor érvényes tárterületre?

Konténerek Haladó C++, 5/ 78 vector deque list asszoc. felép. din.tömb fix méretű tömbök láncolt lista P-F Iterátor Random Random BiDir BiDir Invalid Reallokáció (*) Soha Soha (*): beszúráskor fel kell tenni, hogy az iterátorok érvénytelenné válnak a deque közepéből történő törléskor fel kell tenni, hogy az iterátorok érvénytelenné válnak a deque valamely széléről történő törlés csak a törölt iterátort érvényteleníti a deque iterátorai érvénytelenné válhatnak anélkül, hogy az elemeire hivatkozó referenciák és pointerek is invalidálódnának

Iterátor invalidáció Haladó C++, 6/ 78 std::list<int> n; //... for( std::list<int>::iterator i = n.begin(); i!= n.end(); ++i ) if ( 0 > *i ) n.erase( i ); } }

Iterátor invalidáció Haladó C++, 7/ 78 std::list<int> n; //... for( std::list<int>::iterator i = n.begin(); i!= n.end(); ) if ( 0 > *i ) i = n.erase( i ); } else ++i; } }

Iterátor invalidáció Haladó C++, 8/ 78 std::set<int> s; //... for( std::set<int>::iterator i = s.begin(); i!= s.end(); ) if ( 0 > *i ) s.erase( i++ ); // C++11: iterator-t ad vissza } else ++i; } }

vector reallokáció Haladó C++, 9/ 78 Eljárás: 1 új memóriaterület allokálása (ált. kétszeres kapacitással) 2 elemek átmásolása 3 régi elemek megszüntetése 4 régi memóriaterület deallokálása költség, invalid iterátorok a kapacitás nem csökken automatikusan

vector::reserve Haladó C++, 10/ 78 const int N = 1000; // reserve nélkül vector<int> v; for(int i = 0; i < N; ++i) v.push_back( i ); // reserve-vel vector<int> v; v.reserve( N ); for(int i = 0; i < N; ++i) v.push_back( i );

Haladó C++, 11/ 78 Kapacitás csökkentése A vector és a string kapacitása nem csökken automatikusan Felesleges memóriafoglalás,,swap-trükk : vector<int> v;... vector<int>( v ).swap( v ); string s;... string( s ).swap( s );,,Minimális kapacitás C++11: v.shrink to fit();

Haladó C++, 12/ 78 vector<bool> teljes specializáció (Szabvány) nem bool-okat tárol, tömörebb ábrázolásmód Szabvány szerint az operator[]-nak vissza kell adnia egy referenciát az adott elemre reference egy belső proxy osztály, szimulálja a referenciákat reference-t ad vissza az operator[] vector<bool> v;... bool* p = &v[0]; //???

vector vs. string Haladó C++, 13/ 78 az interface-ük eltér string: specifikus tagfüggvények string másolás: használhat referencia-számlálást vector<char>, ha szükséges

Haladó C++, 14/ 78 Include-ok Bizonyos STL implementációk esetén lefordul: #include <vector> //#include <algorithm> //... vector<int> v; int x; //... vector<int>::iterator i = find( v.begin(), v.end(), x ); Nincs definiálva melyik fejállomány melyik másikat használja. Hordozhatósági problémákat vet fel. Hogyan kerülhető el a hiba?

Haladó C++, 15/ 78 Iterátorok container<t>::iterator container<t>::const_iterator container<t>::reverse_iterator container<t>::const_reverse_iterator istream_iterator<t>, ostream_iterator<t> istreambuf_iterator<t>, ostreambuf_iterator<t> inserter iterátorok

Melyik iterátort használjuk? Haladó C++, 16/ 78 container<t>::iterator: iterator vector<t>::insert( iterator position, const T& x); iterator vector<t>::erase( iterator position ); iterator vector<t>::erase( iterator first, iterator last );

Haladó C++, 17/ 78 Iterátorok konverziója van iterator const iterator konverzió nincs const iterator iterator konverzió... megoldási lehetőség: typedef deque<int>::iterator Iter; typedef deque<int>::const_iterator ConstIter; deque<int> d; ConstIter ci;... Iter i = d.begin(); advance( i, distance<constiter>( i, ci ) ); hatékonyság?

Haladó C++, 18/ 78 Iterátorok konverziója reverse iterator iterator konverzió: base() tagfüggvénnyel Probléma: hova mutat az az iterator, amit a base visszaad? i = ri.base();

Iterátorok konverziója Haladó C++, 19/ 78 Jó-e az az iterator, amit a base tagfüggvény visszaad? Beszúráskor: OK Törléskor: NEM! Container<T> c;... Container<T>::reverse_iterator ri =... // Ez nem minden esetben fordul le: c.erase( --ri.base() ); // Ez mindig jó: c.erase( (++ri).base() );

Spec. iterátorok Haladó C++, 20/ 78 // másoljuk a std.input-ot std.output-ra... copy( istreambuf_iterator<char>( cin ), istreambuf_iterator<char>(), ostreambuf_iterator<char>( cout ) );

Inserterek motivációja Haladó C++, 21/ 78 const int N = 10; double v[n];... double cv[n]; // v másolása cv-be: copy( v, v + N, cv ); // ez általában nem m"uködik a valódi STL // konténerek esetében...

copy implementációja Haladó C++, 22/ 78 template <class InIt, class OutIt> OutIt copy( InIt first, InIt last, OutIt dest ) while ( first!= last ) *dest++ = *first++; } return dest; }

back inserter Haladó C++, 23/ 78 double f( double x )... } list<double> values;... vector<double> results; results.reserve( values.size() ); // f-et alkalmazzuk values összes elemére, és az // adatokat results végére szúrjuk: transform( values.begin(), values.end(), back_inserter( results ), f );

front inserter Haladó C++, 24/ 78 double f( double x )... } list<double> values;... list<double> results; // f-et alkalmazzuk values összes elemére, és // az adatokat results elejére szúrjuk: transform( values.begin(), values.end(), front_inserter( results ), f );

inserter // f-et alkalmazzuk values összes elemére, és az // adatokat results közepére szúrjuk: transform( values.begin(), values.end(), inserter( results, results.begin() + results.size() / 2 ), f ); Haladó C++, 25/ 78 double f( double x )... } list<double> values;... vector<double> results; results.reserve( values.size() );

inserter Haladó C++, 26/ 78 double f( double x )... } list<double> values;... multiset<double> results; // f-et alkalmazzuk values összes elemére, és // az adatokat results-ba szúrjuk (rendezett lesz) transform( values.begin(), values.end(), inserter( results, results.begin() ), f );

back inserter implementációja (vázlat) back_insert_iterator& operator++( int ) return *this; } Haladó C++, 27/ 78 template <class Cont> class back_insert_iterator Cont* c; public: explicit back_insert_iterator( Cont& cont ): c( &cont ) } back_insert_iterator& operator++() return *this; }

back inserter implementációja (vázlat) Haladó C++, 28/ 78 back_insert_iterator& operator=( typename Cont::const_reference d ) // const typename Cont::value_type& d c->push_back( d ); return *this; } back_insert_iterator& operator*() return *this; } };

back inserter implementációja (vázlat) Haladó C++, 29/ 78 template <class Cont> back_insert_iterator back_inserter( Cont& c ) return back_insert_iterator<cont>( c ); }

Haladó C++, 30/ 78 Funktorok Olyan objektumok, amelyeknek van operator()-a (globális) függvényhívások szimulálása Objektumok - állapotok, adattagok, egyéb tagfüggvények Hatékonyság (inline) Speciális hibák elkerülése Ősosztályok : unary function, binary function sablonok. Különös elvárások C++11: Lambda

unary function, binary function Haladó C++, 31/ 78 speciális typedef-eket biztosítanak (alkalmazkodóképesség) ezekre a typedef-ekre szükségük van a függvényobjektum adaptereknek (not1, not2, bind1st, bind2nd) unary function: argument type result type binary function: first argument type second argument type result type

Haladó C++, 32/ 78 unary function, binary function A unary function és a binary function sablon osztályok Származtatni példányokból kell unary function: 2 sablon paraméter binary function: 3 sablon paraméter az utolsó paraméter mindig az operator() visszatérési értéknek,,megfelelő típus az első paraméter(ek)nek az operator() paramétere(i)nek,,megfelelő típus(ok)

Példák struct IntGreater: binary_function<int, int, bool> bool operator()( const int& a, const int& b ) const return b < a; } }; struct CPtrLess: binary_function<const char*, const char*, bool> bool operator()( const char* a, const char* b ) const return strcmp( a, b ) < 0; } }; Haladó C++, 33/ 78

Példák Haladó C++, 34/ 78 class Sum: public unary_function<int, void> int partial_sum; public: Sum(): partial_sum( 0 ) } void operator()( int i ) partial_sum += i; } int get_sum() const return partial_sum; } };

Haladó C++, 35/ 78 Függvények alkalmazkodóképessége függvények + adapterek? (pl. predikátumfüggvény negálása) direktben nem megy, mert hiányoznak a typedef-ek... ptr fun visszaad egy alkalmazkodóképes funktort. Ennek az operator()-a meghívja az eredeti függvényt. példa: bool is_even( int x ); // Els"o páratlan szám megkeresése: list<int> c;... list<int>::iterator i = find_if( c.begin(), c.end(), not1( ptr_fun( is_even ) ) );

mem fun, mem fun ref Haladó C++, 36/ 78 template <class InputIter, class Fun> Fun for_each( InputIter first, InputIter last, Fun f ) while( first!= last ) f( *first++ ); return f; }... struct Foo void bar(); }; list<foo> c; // bar meghívása c összes elemén?

mem fun, mem fun ref Haladó C++, 37/ 78 for_each( c.begin(), c.end(), mem_fun_ref( &Foo::bar ) );... struct Figure virtual void draw() const = 0; virtual ~Figure() } };... list<figure*> c; // draw meghívása (a dinamikus típusnak megfelel"o): for_each( c.begin(), c.end(), mem_fun( &Figure::draw ) );

mem fun ref Impl. Haladó C++, 38/ 78 template <class Ret, class T> class mem_fun_ref_t: public unary_function<t, Ret> Ret ( T::*fptr )(); public: explicit mem_fun_ref_t( Ret ( T::*f )() ) : fptr( f ) } Ret operator()( T& t ) const return ( t.*fptr )(); } }; template <class Ret, class T> inline mem_fun_ref_t<ret, T> mem_fun_ref( Ret ( T::*f )() ) return mem_fun_ref_t<ret, T>( f ); }

Különös elvárások Haladó C++, 39/ 78 Érték-szerinti paraméterátadás: másolás (copy ctor) költséges lehet nem viselkedhet polimorfikusan (virtuális függvények) pimpl-idiom explicit specializáció? Predikátum funktor ill. függvény ne érjen ill. ne tartson fenn olyan változót, amely befolyásolhatja az operator() eredményét (azaz, az operator() értéke mindig csak a paramétereitől függjön). Ez amiatt fontos, mert az algoritmusok másolatokat készíthetnek a funktorból.

Predikátumok másolása az STL-en belül Haladó C++, 40/ 78 template <typename FwdIterator, typename Predicate> FwdIterator remove_if( FwdIterator begin, FwdIterator end, Predicate p ) begin = find_if( begin, end, p ); if ( begin == end ) return begin; else FwdIterator next = begin; return remove_copy_if( ++next, end, begin, p ); } }

Hibás predikátum class BadPredicate: public unary_function<widget, bool> size_t timescalled; public: BadPredicate(): timescalled( 0 ) } bool operator()( const Widget& ) return ++timescalled==3; } }; //... std::list<widget> c; //... c.erase( remove_if( c.begin(), c.end(), BadPredicate() ), c.end() ); // Mit töröl? Haladó C++, 41/ 78

Asszociatív konténerek Haladó C++, 42/ 78 Szabványosak: set multiset map multimap C++11: unordered set unordered multiset unordered map unordered multimap

Haladó C++, 43/ 78 Jellemzők Rendezettség, összehasonĺıtó típus Keresőfa, piros-fekete fa Ekvivalencia Logaritmikus bonyolultságú műveletek

Ekvivalencia vs. egyenlőség Haladó C++, 44/ 78 K: Mikor egyezik meg két elem? V1: Egyenlőség operator== (pl. find algoritmus) V2: Ekvivalencia pl. asszociatív konténerek, rendezett intervallumok kereső algoritmusai (pl. equal range) K: Igaz-e, hogy a kettő megegyezik? V: Nem! V: Például: case-insensitive string összehasonĺıtás

Ekvivalencia Haladó C++, 45/ 78 // Spec. eset: // a és b ekvivalensek, ha (!( a < b ) &&!( b < a ) ) // Általános eset: (!(s.key_comp()( a, b ) ) &&!(s.key_comp()( b, a ) ) ) A multiset / multimap esetében az ekvivalens elemek sorrendje nem definiált

Példa Haladó C++, 46/ 78 struct StringSizeLess : binary_function<string, string, bool> bool operator()( const string& a, const string& b ) const return a.size() < b.size(); } }; multiset<string, StringSizeLess> a; a.insert( "C++" ); cout << a.count( "ADA" ); //?

Amire figyelni kell Haladó C++, 47/ 78 template <class T, class Compare = less<t>, class Allocator = allocator<t> > class set;... set<string*> ssp; //... // Rendezettség?

Megoldás Haladó C++, 48/ 78 // Összehasonlító típus: struct StringPtrLess: binary_function<const string*, const string*, bool> bool operator()( const string* a, const string* b ) const return *a < *b; } }; set<string*, StringPtrLess> ssp; //...

Felhasználói predikátumok vs. Ekvivalencia Haladó C++, 49/ 78 // Próbáljuk meg "<=" alapján // rendezni az elemeket: set<int, less_equal<int> > s; s.insert( 10 ); s.insert( 10 ); // Ellen"orzés: a 10 benne van-e már a konténerben?!(10 <= 10) &&!(10 <= 10): hamis // s-ben 10 kétszer szerepel. Ennek ellenére // s.count( 10 ) == 0

Haladó C++, 50/ 78 Felhasználói predikátumok vs. Ekvivalencia általánosan igaz, hogy megegyező értékekre a predikátumoknak hamisat kell visszaadniuk a multikonténereknél is különben a konténer inkonzisztenssé válik

Felhasználói típusok / felhasználói rendezések Haladó C++, 51/ 78 class Employee public: Employee( const std::string& name ); const string& name() const; const string& get_title() const; void set_title( const std::string& title );... };

Felhasználói típusok / felhasználói rendezések struct EmployeeCompare : std::binary_function<employee, Employee, bool> bool operator()( const Employee& a, const Employee& b ) const return a.name() < b.name(); } }; std::multiset<employee, EmployeeCompare> employees; //... std::string name = "John Doe"; employees.find( name )->set_title( "vice president" ); Haladó C++, 52/ 78

Haladó C++, 53/ 78 Felhasználói típusok / felhasználói rendezések A map és a multimap a kulcsot konstansként kezeli, nem lehet megváltoztatni. A kulcshoz rendelt érték megváltoztatható. A set és a multiset esetében a tárolt értékek konstanssága implementáció-függő. A fenti kód portolhatósági hibákhoz vezet. C++11 előtt/után A konstansság és a nem-konstansság nem elég kifinomult felosztás. mutable? Szükség lenne,,rendezés-megőrző módosítóra? Elméletileg meghívható lehetne minden olyan metódus, ami nem változtatja meg a rendezéshez használt tagok értékét. Az Employee típus írója nem tudhatja előre, hogy milyen rendezéseket használnak később a típuson. (Példa: Student típus: magasság vagy név alapján, stb.)

Haladó C++, 54/ 78 Kereső algoritmusok template <class InputIterator, class T> typename iterator_traits<inputiterator>::difference_type count( InputIterator first, InputIterator last, const T& value ); template <class InputIterator, class T> InputIterator find( InputIterator first, InputIterator last, const T& value );

Kereső algoritmusok Haladó C++, 55/ 78 template <class ForwardIterator, class LessThanComparable> bool binary_search( ForwardIterator first, ForwardIterator last, const LessThanComparable& value ); template <class ForwardIterator, class T, class StrictWeakOrdering> bool binary_search( ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp );

Haladó C++, 56/ 78 Kereső algoritmusok template <class ForwardIterator, class T, class SWeakOrdering> ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const T& value, SWeakOrdering comp ); template <class ForwardIterator, class T, class SWeakOrdering> ForwardIterator upper_bound( ForwardIterator first, ForwardIterator last, const T& value, SWeakOrdering comp );

Kereső algoritmusok Haladó C++, 57/ 78 template <class ForwardIterator, class T, class StrictWeakOrdering> pair<forwarditerator, ForwardIterator> equal_range( ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp ); // Fontos: ugyanazt a rendezési predikátumot kell // használni a kereséshez és a rendezéshez...

Haladó C++, 58/ 78 A remove( if) algoritmus template <class FwdIter, class T> FwdIter remove( FwdIter first, FwdIter last, const T& value); Mit csinál? Mit nem csinál? Miért? Hogyan csináljuk helyesen? Mire kell figyelni?

Haladó C++, 59/ 78 A remove( if) algoritmus Nem töröl. Úgy rendezi át a konténer elemeit, hogy megmaradóak a konténer elején álljanak. Konténer végén (általában) ugyanazok az elemek állnak, mint az algoritmus meghívása előtt (partition algoritmus). Visszaad egy iterátort, ami az,,új logikai végét jelenti a konténernek. Az algoritmusok konténer-függetlenek. Nem tudják, mit jelent az, hogy,,törölni. Az iterátoroktól nem lehet eljutni a konténerhez. remove, remove if, unique partition

Példa Haladó C++, 60/ 78 remove( v.begin(), v.end(), 99 ); után:

A remove helyes használata Haladó C++, 61/ 78 c.erase( remove( c.begin(), c.end(), t ), c.end() ); list<int> li; li.remove( t );

Erase-remove Haladó C++, 62/ 78 // írhatunk egy ilyen segéd függvény sablont: template <class Cont, class T> void erase_remove( Cont& c, const T& t ) c.erase( remove( c.begin(), c.end(), t ), c.end() ); }

memory leak remove if Haladó C++, 63/ 78

memory leak remove if Haladó C++, 64/ 78

Haladó C++, 65/ 78 memory leak elkerülése Hogyan kerüljük el a memory leaket? Végigmegyünk a konténeren, és ha eltávoĺıtandó elemet találunk, akkor megszüntetjük a dinamikusan allokációt, és nullpointerre álĺıtjuk a pointert. A remove-val eltávoĺıtjuk a nullpointereket. Kikötés, hogy nem volt nullpointer a konténerben...

Haladó C++, 66/ 78 Algoritmusok vs. tagfüggvények Bizonyos konténerek esetében léteznek olyan tagfüggvények, amelyeknek a neve megegyezik egy algoritmus nevével AssocCont::find, AssocCont::count, AssocCont::equal range, AssocCont::lower bound, AssocCont::upper bound list::remove, list::sort, list::unique, list::reverse Melyiket válasszuk? Miért?

Haladó C++, 67/ 78 Algoritmusok vs. tagfüggvények A tagfüggvényeket érdemes választani Hatékonyság, helyes működés, leforduló kódok Hatékonyság: AssocCont::find, AssocCont::count, list::remove Helyes működés: list::remove, AssocCont::count, AssocCont::find Leforduló kódok: list::sort

Haladó C++, 68/ 78 Algoritmusok vs. kézzel írt ciklusok Sokszor egyszerűbbnek tűnik kézzel írt ciklusokkal dolgozni algoritmusok helyett (nem kell funktorozni, mem fun, binderek, stb.) Miért használjunk algoritmusokat? Hatékonyság, a nevek szemantikája miatt: nagyobb kifejezőerővel rendelkeznek... Speciális könyvtári optimalizációk, kevesebb kiértékelés... Érvénytelen iterátorok elkerülése... Bizonyos esetekben javít a kód átláthatóságán a kézzel írt ciklus, de ez ritka...

Példa Haladó C++, 69/ 78 size_t fillarray( double *parray, size_t arraysize ); double data[maxnumdoubles]; deque<double> d; //... size_t numdoubles = fillarray( data, maxnumdoubles ); for( size_t i = 0; i < numdoubles; ++i ) d.insert( d.begin(), data[i] + 41 ); }

Példa Haladó C++, 70/ 78 size_t fillarray( double *parray, size_t arraysize ); double data[maxnumdoubles]; deque<double> d; //... size_t numdoubles = fillarray( data, maxnumdoubles ); deque<double>::iterator insertlocation = d.begin(); for( size_t i = 0; i < numdoubles; ++i ) d.insert( insertlocation++, data[i] + 41 );

Példa size_t fillarray( double *parray, size_t arraysize ); double data[maxnumdoubles]; deque<double> d; //... size_t numdoubles = fillarray( data, maxnumdoubles ); deque<double>::iterator insertlocation = d.begin(); for( size_t i = 0; i < numdoubles; ++i ) insertlocation = d.insert( insertlocation, data[i] + 41 ); ++insertlocation; } Haladó C++, 71/ 78

Példa Haladó C++, 72/ 78 transform( data, data + numdoubles, inserter( d, d.begin() ), bind2nd( plus<double>(), 41 ) );

iterator traits Haladó C++, 73/ 78 Különböző információk kinyerése az iterátorokból struct output_iterator_tag }; struct input_iterator_tag }; struct forward_iterator_tag : input_iterator_tag }; struct bidirectional_iterator_tag : forward_iterator_tag }; struct random_access_iterator_tag : bidirectional_iterator_tag };

iterator traits Haladó C++, 74/ 78 // Példa: pointerek. Hmmm... void*??? template <class T> struct iterator_traits<t*> typedef T value_type; typedef ptrdiff_t difference_type; typedef random_access_iterator_tag iterator_category; typedef T* pointer; typedef T& reference; };

iterator traits Haladó C++, 75/ 78 // Alkalmazások: template <class Iterator> void algoritmus( Iterator first, Iterator last ) typename iterator_traits<iterator>::value_type o = *first;... }

iterator traits // Alkalmazások: template <class Iter> inline void foo( Iter beg, Iter end ) foo( beg, end, typename iterator_traits<iter>::iterator_category() ); } template <class BiIterator> void foo( BiIterator beg, BiIterator end, bidirectional_iterator_tag ) // foo algoritmus implementációja // bidirectional iteratorokhoz } Haladó C++, 76/ 78

iterator traits Haladó C++, 77/ 78 template <class RaIterator> void foo( RaIterator beg, RaIterator end, random_access_iterator_tag ) // foo algoritmus implementációja // random_access iteratorokhoz } distance advance

Haladó C++, 78/ 78 C++11 unordered set, unordered multiset unordered map, unordered multimap array forward list