78
C++ Standard Template Library Pataki Norbert 2014. ´ aprilis 2. Halad´o C++, 1/ 78

C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

  • Upload
    vungoc

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

C++ Standard Template Library

Pataki Norbert

2014. aprilis 2.

Halado C++, 1/ 78

Page 2: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Generic programming, generikus programozas

I Expression problem

I OOP vs. generic programming

I Parhuzamos bovıthetoseg

I Lifting abstraction

Halado C++, 2/ 78

Page 3: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

C++ Standard Template Library

I Kontenerek

I Algoritmusok

I Iteratorok

I Atalakıtok

I Funktorok

I Allokatorok

Halado C++, 3/ 78

Page 4: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Iterator invalidacio

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();

I Meddig hivatkozik az iterator az ottlevo elemre?

I Meddig hivatkozik az iterator ervenyes tarteruletre?

Halado C++, 4/ 78

Page 5: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Kontenerek

vector deque list asszoc.

felep. din.tomb fix meretu tombok lancolt lista P-F

Iterator Random Random BiDir BiDir

Invalid Reallokacio (*) Soha Soha

I (*):I beszuraskor fel kell tenni, hogy az iteratorok ervenytelenne

valnakI a deque kozepebol torteno torleskor fel kell tenni, hogy az

iteratorok ervenytelenne valnakI a deque valamely szelerol torteno torles csak a torolt iteratort

ervenytelenıtiI a deque iteratorai ervenytelenne valhatnak anelkul, hogy az

elemeire hivatkozo referenciak es pointerek is invalidalodnanak

Halado C++, 5/ 78

Page 6: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Iterator invalidacio

std::list<int> n;// ...for( std::list<int>::iterator i = n.begin();

i != n.end();++i )

{if ( 0 > *i ){n.erase( i );

}}

Halado C++, 6/ 78

Page 7: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Iterator invalidacio

std::list<int> n;// ...for( std::list<int>::iterator i = n.begin();

i != n.end(); ){if ( 0 > *i ){i = n.erase( i );

}else{++i;

}}

Halado C++, 7/ 78

Page 8: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Iterator invalidacio

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;

}}

Halado C++, 8/ 78

Page 9: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

vector reallokacio

I Eljaras:

1 uj memoriaterulet allokalasa (alt. ketszeres kapacitassal)2 elemek atmasolasa3 regi elemek megszuntetese4 regi memoriaterulet deallokalasa

I koltseg, invalid iteratorok

I a kapacitas nem csokken automatikusan

Halado C++, 9/ 78

Page 10: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

vector::reserve

const int N = 1000;// reserve nelkulvector<int> v;for(int i = 0; i < N; ++i)v.push_back( i );

// reserve-velvector<int> v;v.reserve( N );for(int i = 0; i < N; ++i)v.push_back( i );

Halado C++, 10/ 78

Page 11: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Kapacitas csokkentese

I A vector es a string kapacitasa nem csokken automatikusan

I Felesleges memoriafoglalas

I ,,Swap-trukk”:

vector<int> v;...vector<int>( v ).swap( v );

string s;...string( s ).swap( s );

I ,,Minimalis” kapacitas

I C++11: v.shrink to fit();

Halado C++, 11/ 78

Page 12: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

vector<bool>

I teljes specializacio (Szabvany)

I nem bool-okat tarol, tomorebb abrazolasmod

I Szabvany szerint az operator[]-nak vissza kell adnia egyreferenciat az adott elemre

I reference egy belso proxy osztaly, szimulalja a referenciakat

I reference-t ad vissza az operator[]

vector<bool> v;...bool* p = &v[0]; // ???

Halado C++, 12/ 78

Page 13: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

vector vs. string

I az interface-uk elter

I string: specifikus tagfuggvenyek

I string masolas: hasznalhat referencia-szamlalast

I vector<char>, ha szukseges

Halado C++, 13/ 78

Page 14: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Include-ok

Bizonyos STL implementaciok eseten lefordul:

#include <vector>//#include <algorithm>// ...vector<int> v;int x;// ...

vector<int>::iterator i =find( v.begin(), v.end(), x );

I Nincs definialva melyik fejallomany melyik masikat hasznalja.

I Hordozhatosagi problemakat vet fel.

I Hogyan kerulheto el a hiba?

Halado C++, 14/ 78

Page 15: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Iteratorok

I container<T>::iterator

I container<T>::const_iterator

I container<T>::reverse_iterator

I container<T>::const_reverse_iterator

I istream_iterator<T>, ostream_iterator<T>

I istreambuf_iterator<T>, ostreambuf_iterator<T>

I inserter iteratorok

Halado C++, 15/ 78

Page 16: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Melyik iteratort hasznaljuk?

I container<T>::iterator:I iterator vector<T>::insert( iterator position,

const T& x);I iterator vector<T>::erase( iterator position );I iterator vector<T>::erase( iterator first,

iterator last );

Halado C++, 16/ 78

Page 17: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Iteratorok konverzioja

I van iterator → const iterator konverzio

I nincs const iterator → iterator konverzio...

I megoldasi lehetoseg:

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

I hatekonysag?

Halado C++, 17/ 78

Page 18: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Iteratorok konverzioja

I reverse iterator → iterator konverzio: base()tagfuggvennyel

I Problema: hova mutat az az iterator, amit a base visszaad?

i = ri.base();

Halado C++, 18/ 78

Page 19: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Iteratorok konverzioja

I Jo-e az az iterator, amit a base tagfuggveny visszaad?I Beszuraskor: OKI Torleskor: NEM!

Container<T> c;...Container<T>::reverse_iterator ri = ...

// Ez nem minden esetben fordul le:c.erase( --ri.base() );

// Ez mindig jo:c.erase( (++ri).base() );

Halado C++, 19/ 78

Page 20: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Spec. iteratorok

// masoljuk a std.input-ot std.output-ra...

copy( istreambuf_iterator<char>( cin ),istreambuf_iterator<char>(),ostreambuf_iterator<char>( cout ) );

Halado C++, 20/ 78

Page 21: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Inserterek motivacioja

const int N = 10;double v[N];...double cv[N];

// v masolasa cv-be:copy( v, v + N, cv );

// ez altalaban nem m"ukodik a valodi STL// kontenerek eseteben...

Halado C++, 21/ 78

Page 22: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

copy implementacioja

template <class InIt, class OutIt>OutIt copy( InIt first, InIt last, OutIt dest ){while ( first != last ){*dest++ = *first++;

}return dest;

}

Halado C++, 22/ 78

Page 23: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

back inserter

double f( double x ){...}

list<double> values;...vector<double> results;results.reserve( values.size() );

// f-et alkalmazzuk values osszes elemere, es az// adatokat results vegere szurjuk:transform( values.begin(), values.end(),

back_inserter( results ), f );

Halado C++, 23/ 78

Page 24: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

front inserter

double f( double x ){...}

list<double> values;...list<double> results;

// f-et alkalmazzuk values osszes elemere, es// az adatokat results elejere szurjuk:transform( values.begin(), values.end(),

front_inserter( results ), f );

Halado C++, 24/ 78

Page 25: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

inserter

double f( double x ){...}

list<double> values;...vector<double> results;results.reserve( values.size() );

// f-et alkalmazzuk values osszes elemere, es az// adatokat results kozepere szurjuk:transform(values.begin(), values.end(),inserter( results,

results.begin() + results.size() / 2 ),f ); Halado C++, 25/ 78

Page 26: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

inserter

double f( double x ){...}

list<double> values;...multiset<double> results;

// f-et alkalmazzuk values osszes elemere, es// az adatokat results-ba szurjuk (rendezett lesz)transform( values.begin(), values.end(),

inserter( results, results.begin() ), f );

Halado C++, 26/ 78

Page 27: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

back inserter implementacioja (vazlat)

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_insert_iterator& operator++( int ){return *this;

} Halado C++, 27/ 78

Page 28: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

back inserter implementacioja (vazlat)

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;

}};

Halado C++, 28/ 78

Page 29: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

back inserter implementacioja (vazlat)

template <class Cont>back_insert_iterator back_inserter( Cont& c ){return back_insert_iterator<Cont>( c );

}

Halado C++, 29/ 78

Page 30: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Funktorok

I Olyan objektumok, amelyeknek van operator()-a – (globalis)fuggvenyhıvasok szimulalasa

I Objektumok - allapotok, adattagok, egyeb tagfuggvenyek

I Hatekonysag (inline)

I Specialis hibak elkerulese

I Ososztalyok : unary function, binary function sablonok.

I Kulonos elvarasok

I C++11: Lambda

Halado C++, 30/ 78

Page 31: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

unary function, binary function

I specialis typedef-eket biztosıtanak (alkalmazkodokepesseg)

I ezekre a typedef-ekre szukseguk van a fuggvenyobjektumadaptereknek (not1, not2, bind1st, bind2nd)

I unary function:I argument typeI result type

I binary function:I first argument typeI second argument typeI result type

Halado C++, 31/ 78

Page 32: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

unary function, binary function

I A unary function es a binary function sablon osztalyok

I Szarmaztatni peldanyokbol kell

I unary function: 2 sablon parameter

I binary function: 3 sablon parameter

I az utolso parameter mindig az operator() visszateresierteknek ,,megfelelo” tıpus

I az elso parameter(ek)nek az operator() parametere(i)nek,,megfelelo” tıpus(ok)

Halado C++, 32/ 78

Page 33: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Peldak

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;

}};

Halado C++, 33/ 78

Page 34: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Peldak

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;

}};

Halado C++, 34/ 78

Page 35: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Fuggvenyek alkalmazkodokepessege

I fuggvenyek + adapterek? (pl. predikatumfuggveny negalasa)

I direktben nem megy, mert hianyoznak a typedef-ek...

I ptr fun visszaad egy alkalmazkodokepes funktort. Ennek azoperator()-a meghıvja az eredeti fuggvenyt.

I pelda:

bool is_even( int x );

// Els"o paratlan szam megkeresese:list<int> c;...list<int>::iterator i =find_if( c.begin(), c.end(),

not1( ptr_fun( is_even ) ) );

Halado C++, 35/ 78

Page 36: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

mem fun, mem fun ref

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ıvasa c osszes elemen?

Halado C++, 36/ 78

Page 37: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

mem fun, mem fun ref

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ıvasa (a dinamikus tıpusnak megfelel"o):for_each( c.begin(), c.end(), mem_fun( &Figure::draw ) );

Halado C++, 37/ 78

Page 38: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

mem fun ref – Impl.

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

Halado C++, 38/ 78

Page 39: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Kulonos elvarasok

I Ertek-szerinti parameteratadas:I masolas (copy ctor) – koltseges lehetI nem viselkedhet polimorfikusan (virtualis fuggvenyek)I pimpl-idiomI explicit specializacio?

I Predikatum funktor ill. fuggveny ne erjen ill. ne tartson fennolyan valtozot, amely befolyasolhatja az operator()eredmenyet (azaz, az operator() erteke mindig csak aparametereitol fuggjon). Ez amiatt fontos, mert azalgoritmusok masolatokat keszıthetnek a funktorbol.

Halado C++, 39/ 78

Page 40: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Predikatumok masolasa az STL-en belul

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

}}

Halado C++, 40/ 78

Page 41: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Hibas predikatum

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 torol?Halado C++, 41/ 78

Page 42: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Asszociatıv kontenerek

I Szabvanyosak:I setI multisetI mapI multimap

I C++11:I unordered setI unordered multisetI unordered mapI unordered multimap

Halado C++, 42/ 78

Page 43: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Jellemzok

I Rendezettseg, osszehasonlıto tıpus

I Keresofa, piros-fekete fa

I Ekvivalencia

I Logaritmikus bonyolultsagu muveletek

Halado C++, 43/ 78

Page 44: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Ekvivalencia vs. egyenloseg

I K: Mikor egyezik meg ket elem?I V1: Egyenloseg – operator== (pl. find algoritmus)I V2: Ekvivalencia – pl. asszociatıv kontenerek, rendezett

intervallumok kereso algoritmusai (pl. equal range)

I K: Igaz-e, hogy a ketto megegyezik?I V: Nem!I V: Peldaul: case-insensitive string osszehasonlıtas

Halado C++, 44/ 78

Page 45: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Ekvivalencia

// Spec. eset:// a es b ekvivalensek, ha( !( a < b ) && !( b < a ) )

// Altalanos eset:( !(s.key_comp()( a, b ) ) &&!(s.key_comp()( b, a ) ) )

I A multiset / multimap eseteben az ekvivalens elemeksorrendje nem definialt

Halado C++, 45/ 78

Page 46: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Pelda

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" ); // ?

Halado C++, 46/ 78

Page 47: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Amire figyelni kell

template <class T,class Compare = less<T>,class Allocator = allocator<T> >

class set;

...

set<string*> ssp;// ...// Rendezettseg?

Halado C++, 47/ 78

Page 48: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Megoldas

// Osszehasonlıto 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;// ...

Halado C++, 48/ 78

Page 49: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Felhasznaloi predikatumok vs. Ekvivalencia

// Probaljuk meg "<=" alapjan// rendezni az elemeket:set<int, less_equal<int> > s;

s.insert( 10 );s.insert( 10 );

// Ellen"orzes: a 10 benne van-e mar a kontenerben?!(10 <= 10) && !(10 <= 10): hamis// s-ben 10 ketszer szerepel. Ennek ellenere// s.count( 10 ) == 0

Halado C++, 49/ 78

Page 50: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Felhasznaloi predikatumok vs. Ekvivalencia

I altalanosan igaz, hogy megegyezo ertekekre apredikatumoknak hamisat kell visszaadniuk

I a multikontenereknel is

I kulonben a kontener inkonzisztensse valik

Halado C++, 50/ 78

Page 51: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Felhasznaloi tıpusok / felhasznaloi rendezesek

class Employee{public:Employee( const std::string& name );const string& name() const;const string& get_title() const;void set_title( const std::string& title );...

};

Halado C++, 51/ 78

Page 52: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Felhasznaloi tıpusok / felhasznaloi rendezesek

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" );

Halado C++, 52/ 78

Page 53: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Felhasznaloi tıpusok / felhasznaloi rendezesek

I A map es a multimap a kulcsot konstanskent kezeli, nem lehetmegvaltoztatni. A kulcshoz rendelt ertek megvaltoztathato.

I A set es a multiset eseteben a tarolt ertekek konstanssagaimplementacio-fuggo.

I A fenti kod portolhatosagi hibakhoz vezet.

I C++11 elott/utan

I A konstanssag es a nem-konstanssag nem eleg kifinomultfelosztas. mutable?

I Szukseg lenne ,,rendezes-megorzo” modosıtora?

I Elmeletileg meghıvhato lehetne minden olyan metodus, aminem valtoztatja meg a rendezeshez hasznalt tagok erteket.

I Az Employee tıpus ıroja nem tudhatja elore, hogy milyenrendezeseket hasznalnak kesobb a tıpuson. (Pelda: Studenttıpus: magassag vagy nev alapjan, stb.)

Halado C++, 53/ 78

Page 54: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Kereso algoritmusok

I template <class InputIterator, class T>typenameiterator_traits<InputIterator>::difference_type

count( InputIterator first, InputIterator last,const T& value );

I template <class InputIterator, class T>InputIterator find( InputIterator first,

InputIterator last,const T& value );

Halado C++, 54/ 78

Page 55: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Kereso algoritmusok

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

Halado C++, 55/ 78

Page 56: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Kereso algoritmusok

I template <class ForwardIterator,class T,class SWeakOrdering>

ForwardIterator lower_bound( ForwardIterator first,ForwardIterator last,const T& value,SWeakOrdering comp );

I template <class ForwardIterator,class T,class SWeakOrdering>

ForwardIterator upper_bound( ForwardIterator first,ForwardIterator last,const T& value,SWeakOrdering comp );

Halado C++, 56/ 78

Page 57: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Kereso algoritmusok

template <class ForwardIterator,class T,class StrictWeakOrdering>

pair<ForwardIterator, ForwardIterator>equal_range( ForwardIterator first,

ForwardIterator last,const T& value,StrictWeakOrdering comp );

// Fontos: ugyanazt a rendezesi predikatumot kell// hasznalni a kereseshez es a rendezeshez...

Halado C++, 57/ 78

Page 58: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

A remove( if) algoritmus

template <class FwdIter, class T>FwdIter remove( FwdIter first, FwdIter last,

const T& value);

I Mit csinal? Mit nem csinal?

I Miert?

I Hogyan csinaljuk helyesen?

I Mire kell figyelni?

Halado C++, 58/ 78

Page 59: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

A remove( if) algoritmus

I Nem torol.

I Ugy rendezi at a kontener elemeit, hogy megmaradoak akontener elejen alljanak.

I Kontener vegen (altalaban) ugyanazok az elemek allnak, mintaz algoritmus meghıvasa elott (partition algoritmus).

I Visszaad egy iteratort, ami az ,,uj logikai veget” jelenti akontenernek.

I Az algoritmusok kontener-fuggetlenek. Nem tudjak, mit jelentaz, hogy ,,torolni”. Az iteratoroktol nem lehet eljutni akontenerhez.

I remove, remove if, unique

I partition

Halado C++, 59/ 78

Page 60: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Pelda

remove( v.begin(), v.end(), 99 ); utan:

Halado C++, 60/ 78

Page 61: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

A remove helyes hasznalata

c.erase( remove( c.begin(),c.end(),t ),

c.end() );

list<int> li;li.remove( t );

Halado C++, 61/ 78

Page 62: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Erase-remove

// ırhatunk egy ilyen seged fuggveny sablont:

template <class Cont, class T>void erase_remove( Cont& c, const T& t ){c.erase( remove( c.begin(), c.end(), t ), c.end() );

}

Halado C++, 62/ 78

Page 63: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

memory leak – remove if

Halado C++, 63/ 78

Page 64: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

memory leak – remove if

Halado C++, 64/ 78

Page 65: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

memory leak elkerulese

I Hogyan keruljuk el a memory leaket?

I Vegigmegyunk a konteneren, es ha eltavolıtando elemettalalunk, akkor megszuntetjuk a dinamikusan allokaciot, esnullpointerre allıtjuk a pointert.

I A remove-val eltavolıtjuk a nullpointereket.

I Kikotes, hogy nem volt nullpointer a kontenerben...

Halado C++, 65/ 78

Page 66: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Algoritmusok vs. tagfuggvenyek

I Bizonyos kontenerek eseteben leteznek olyan tagfuggvenyek,amelyeknek a neve megegyezik egy algoritmus nevevel

I AssocCont::find, AssocCont::count, AssocCont::equal range,AssocCont::lower bound, AssocCont::upper bound

I list::remove, list::sort, list::unique, list::reverse

I Melyiket valasszuk? Miert?

Halado C++, 66/ 78

Page 67: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Algoritmusok vs. tagfuggvenyek

I A tagfuggvenyeket erdemes valasztani

I Hatekonysag, helyes mukodes, lefordulo kodok

I Hatekonysag: AssocCont::find, AssocCont::count, list::remove

I Helyes mukodes: list::remove, AssocCont::count,AssocCont::find

I Lefordulo kodok: list::sort

Halado C++, 67/ 78

Page 68: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Algoritmusok vs. kezzel ırt ciklusok

I Sokszor egyszerubbnek tunik kezzel ırt ciklusokkal dolgoznialgoritmusok helyett (nem kell funktorozni, mem fun,binderek, stb.)

I Miert hasznaljunk algoritmusokat?

I Hatekonysag, a nevek szemantikaja miatt: nagyobbkifejezoerovel rendelkeznek...

I Specialis konyvtari optimalizaciok, kevesebb kiertekeles...

I Ervenytelen iteratorok elkerulese...

I Bizonyos esetekben javıt a kod atlathatosagan a kezzel ırtciklus, de ez ritka...

Halado C++, 68/ 78

Page 69: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Pelda

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

}

Halado C++, 69/ 78

Page 70: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Pelda

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

Halado C++, 70/ 78

Page 71: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Pelda

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

Halado C++, 71/ 78

Page 72: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

Pelda

transform( data, data + numDoubles,inserter( d, d.begin() ),bind2nd( plus<double>(), 41 ) );

Halado C++, 72/ 78

Page 73: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

iterator traits

I Kulonbozo informaciok kinyerese az iteratorokbol

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

Halado C++, 73/ 78

Page 74: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

iterator traits

// Pelda: 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;

};

Halado C++, 74/ 78

Page 75: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

iterator traits

// Alkalmazasok:template <class Iterator>void algoritmus( Iterator first, Iterator last ){typenameiterator_traits<Iterator>::value_type o = *first;

...}

Halado C++, 75/ 78

Page 76: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

iterator traits

// Alkalmazasok:template <class Iter>inline void foo( Iter beg, Iter end ){

foo( beg, end,typenameiterator_traits<Iter>::iterator_category() );

}

template <class BiIterator>void foo( BiIterator beg, BiIterator end,

bidirectional_iterator_tag ){

// foo algoritmus implementacioja// bidirectional iteratorokhoz

}Halado C++, 76/ 78

Page 77: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

iterator traits

template <class RaIterator>void foo( RaIterator beg, RaIterator end,

random_access_iterator_tag ){

// foo algoritmus implementacioja// random_access iteratorokhoz

}

I distance

I advance

Halado C++, 77/ 78

Page 78: C++ Standard Template Library - Eötvös Loránd Universityaszt.inf.elte.hu/~gsd/multiparadigm/5_stl/PatakiNorbertSTL.pdf · C++ Standard Template Library I Kont¶enerek I Algoritmusok

C++11

I unordered set, unordered multiset

I unordered map, unordered multimap

I array

I forward list

Halado C++, 78/ 78