( rednio) zaawansowane programowanie w C++ (ZPR) Wykªad 6 - ª czenie C++ i a, powtórzenie Robert Nowak 2015Z ( rednio) zaawansowane programowanie w C++ (ZPR) 1/46
Š czenie C i C++ C Kompilatory musz by zgodne (w taki sam sposób reprezentowa typy wbudowane) problemy: dekorowanie nazw dla linkera struktury danych funkcja main operacje na stercie ( rednio) zaawansowane programowanie w C++ (ZPR) 2/46
dekorowanie nazw C linker w C nazwy nie mog by przeci»ane w C++ mog nazwa funkcji jest dekorowana przez kompilator C++ (name mengling, name decoration) extern "C" { //Zapobiega dekorowaniu nazw int funkcja(int a, int b) /*... */ } //Zapobiega dekorowaniu nazw je»eli jest kompilowane przez C++ #ifdef cplusplus extern "C" { #endif int funkcja( int a, int b) /*... */ #ifdef cplusplus } #endif ( rednio) zaawansowane programowanie w C++ (ZPR) 3/46
funkcja main i struktury danych C Nale»y wybiera implementacj main z C++, poniewa» zapewnia ona prawidªow inicjacj skªadowych statycznych zapewnia woªanie destruktorów dla skªadowych statycznych Struktury danych (tylko te, które s dost pne w C): typy wbudowane, POD struktury, które nie maj funkcji wirtualnych obiekty, które zostaªy powoªane przez new powinny by zwalniane przez delete pami zaalokowana przez malloc powinna by zwalniana przez free ( rednio) zaawansowane programowanie w C++ (ZPR) 4/46
interpretowany, interaktywny j zyk programowania Software Fundation, www.python.org programowanie funkcyjne, obiektowe i strukturalne dynamiczna kontrola typów brak enkapsulacji zarz dzanie pami ci przez garbage collection dokumentacja w kodzie ¹ródªowym zmienna liczba argumentów funkcji i metod zaznaczanie bloków przez wci cia ( rednio) zaawansowane programowanie w C++ (ZPR) 5/46
- hello world uruchomienie interpretera python >>> print 'Hello world!' # comments after hash >>> quit() skrypt utworzenie pliku o nazwie hello.py print 'Hello world!' uruchomienie skryptu python hello.py ( rednio) zaawansowane programowanie w C++ (ZPR) 6/46
, obliczenia - wykorzystanie interpretera do oblicze«>>> 2+2 4 >>> (2+3*3)/2 # arytmetyka caªkowita 5 >>> width = 20.1 >>> height = 5/2.0 # arytmetyka rzeczywista >>> width * height 50.25 >>> x = y = 0 # równoczesne przypisanie do dwóch obiektów >>> n # odwoªanie si do niezdefiniowanego obiektu Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'n' is not defined None oznacza brak warto±ci x = None ( rednio) zaawansowane programowanie w C++ (ZPR) 7/46
, obliczenia (2) % modulo (5 % 2 = 1) Funkcje wbudowane ** pot ga (2 ** 3 = 8) int() konwersja (podªoga) float() konwersja Math module (import math) math.pi π = 3.1415... math.e e = 2.718281... math.sqrt() pierwiastek kwadratowy math.log(), math.log10(), funkcje wykªadnicze i logarytmiczne math.exp(x), math.pow(x,y) dodatkowo funkcje trygonometryczne i inne Google: python math or http://docs.python.org/library/math.html ( rednio) zaawansowane programowanie w C++ (ZPR) 8/46
- napis >>> s = 'Hello' # pojedyncze lub podwójne cudzysªowy >>> print s Hello >>> print s + "world" # konkatenacja przez operator + Hello world >>> print s + ' man'*3 # powtórzenia napisów za pomoc * Hello man man man >>> u'hello' # unicode >>> print u'section \u00a7'# unicode character >>> unicode('xyz','utf-8') # ASCII, UTF-8, UTF-16, Latin-1, etc. Indeksowanie >>> s = 'Hello' >>> s[0] # pierwsza litera, tutaj 'H' >>> s[-1] # ujemy indeks oznacza liczenie od ko«ca, tutaj 'o' >>> s[1:3] # substring, tutaj 'ell' >>> s[:3] # pierwszy indeks jest domy±lnie równy 0 >>> s[1:] # drugi indeks jest domy±lnie równy dªugo±ci napisu >>> len(s)# dªugo± napisu ( rednio) zaawansowane programowanie w C++ (ZPR) 9/46
- lista l = [ 'Hello', 'world', 1, 2] # elementy listy mog by ró»nych typów l[0] # indeks u»ywany dla list len(l) # liczba elementów w liscie l[1:3] # wycinanie dla list (podobnie jak dla napisów) l + [ 'X', 'Y' ] # ª czenie list print l[2:]*3 # powtórzenia dla list l[0] = 'cat' # l = [ 'cat', 'world', 1, 2 ] l.append('mouse') # dodaje element na koniec listy l[0:2] = [ 'xxx' ] # modyfikuje list, mo»e doda lub usun elementy l[:] = [ ] # czy±ci list l = [ 1, 2, 3 ] m = [ l, [ 4 ] ] # m jest list list # [[1, 2, 3], [4]] ( rednio) zaawansowane programowanie w C++ (ZPR) 10/46
- sªownik len(d) - liczba obiektów w sªowniku k in d - czy d zawiera klucz k d[k] - zwraca warto± dla klucza k, je»eli brak klucza zgªasza wyj tek KeyError d[k] = val - dodaje par klucz-warto±, je»eli poprzednio istniaªa para jest nadpisywana d = {'one':1, 'three':3} # tworzy sªownik d['two'] = 1 # d = { 'one':1, 'three':3, 'two':1 } d['two'] = 2 # d = { 'one':1, 'three':3, 'two':2 } d = {'John Smidth': '+48 213-234-22', 'Mark Brown' : '+01 234 121212', 'Max Sugar' : '+853 0123456' } ( rednio) zaawansowane programowanie w C++ (ZPR) 11/46
- instrukcje steruj ce Bloki s oznaczane przez wci cia x = int(raw_input("enter integer:")) if x < 0: print 'Negative' elif x == 0: print 'Zero' else: print 'Positive' while x > 0: # p tla while x = x - 1 print x animals = [ 'dog', 'cat', 'mouse' ] for a in animals: # p tla for for i in range(len(a)): # range generuje list, np. [0, 1, 2] print a[:i] ( rednio) zaawansowane programowanie w C++ (ZPR) 12/46
Programowanie strukturalne w ie Nowa funkcja deniowana za pomoc def Przykªad: wie»e Hanoi, animacja: http://en.wikipedia.org/wiki/file: Tower_of_Hanoi_4.gif a b c a b c a b c a b c def hanoi(in_tower, out_tower, tmp_tower, nr): "documentation of the function" # narz dzia u»ywaj tego opisu if nr == 1: print 'move 1 from ' + in_tower + ' to ' + out_tower return hanoi(in_tower, tmp_tower, out_tower, nr - 1) print 'move ' + str(nr) + ' from ' + in_tower + ' to ' + out_tower hanoi(tmp_tower, out_tower, in_tower, nr - 1) return ( rednio) zaawansowane programowanie w C++ (ZPR) 13/46
- wyj tki 1 def f(i): 2 if i == 2: 3 raise Exception('i==2') 4 else: 5 g(i-1) 6 def g(i): 7 while i > 0: 8 i = i - 1; 9 f(i) 10 def h(i): 11 try: 12 g(i) 13 except Exception: 14 pass 15 h(5) linia 15 h(5) 10 i=5 11 * 12 * g(5) 06 i=5 07 * 08 i=4 09 * f(4) 01 i=4 02 * 04 * 05 * g(3) 06 i=3 07 * 08 i=2 09 * f(2) 01 i=2 02 * 03 * 13 * 14 * ( rednio) zaawansowane programowanie w C++ (ZPR) 14/46
Programowanie funkcyjne w ie >>>g= lambda x: x**2 # tworzy funkcj anomimow >>>g(4) 16 >>>add = lambda a, b: a+b >>>add(2,3) 5 >>># pierwszy argument to warunek >>>print filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5, 6, 7]) [2, 4, 6] >>># domkni cie (closure) - zapami tuje otoczenie funkcji >>>def callback(msg):... print msg >>>words = ['do', 're', 'mi' ] >>>func = [] >>>for w in words:... func.append( lambda p = w: callback(p) ) >>>func[0]() do ( rednio) zaawansowane programowanie w C++ (ZPR) 15/46
- moduª (plik) Moduª - plik z rozszerzeniem py zawieraj cy kod a wewn trz moduªu jego nazwa jest zmienn name gdy moduª jest uruchomiony jako skrypt python module.py jego nazw jest ' main ' denicje mog by u»yte w innym module import name Funkcje: dir(module-name) - zawarto± moduªu help(module-name) - dokumentacja moduªu Moduª mo»e zawiera sekcj wykonywan gdy po raz pierwszy moduª jest u»yty def f() # definicja if name == ' main ': # nie uruchamia gdy moduª jest doª czany # sekcja wykonywana gdy moduª jest woªany jako skrypt ( rednio) zaawansowane programowanie w C++ (ZPR) 16/46
- programowanie obiektowe denicja klasy po sªowie kluczowym class class MyClass: default_x = 1 # skªadowa statyczna def init (self, x, y=0): # metoda inicjuj ca self.x = x # skªadowa obiektu self.y = y # skªadowa obiektu def f(self): # metoda return self.x j zyk upraszcza woªanie metody inicjuj cej obiekt, np. m=myclass(23), wtedy m.x==23 j zyk upraszcza dost p do atrybutu lub woªanie metody, np. m.f() to to samo co MyClass.f(m) pierwszy atrybut metody jest wymieniony jawnie, przyj ªo si go nazywa self ( rednio) zaawansowane programowanie w C++ (ZPR) 17/46
- (wielo)dziedziczenie # dziedziczenie class DerivedClass(BaseClass): # definicja klasy pochodnej je»eli atrybut (lub metoda) nie jest zdeniowana w danej klasie klasy bazowe s przeszukiwane (rekursywnie) wszystkie metody zachowuj si jak wirtualne w C++ mo»na woªa metody wprost BaseClass.method(self, arguments) brak enkapsulacji (wszystkie metody i skªadowe s publiczne) isinstance(obj, class) bada, czy obj is typu class issubclass(classa, classb) bada, zcy classa jest pochodna po classb ( rednio) zaawansowane programowanie w C++ (ZPR) 18/46
- programowanie obiektowe (2) Mo»na dodawa metody w czasie dziaªania class A(): def init (self): self.i = 0 def f(self, p): print 'A::f, i=' + str(self.i) + ' p=' + str(p) >>>a=a() >>>a.f(1) A::f, i=0 p=1 >>>a. class.g = lambda self: self.f('ala') >>>a.g() A::f, i=0, p=ala ( rednio) zaawansowane programowanie w C++ (ZPR) 19/46
Pakiety Pakiet - katalog zawieraj cy moduªy a i moduª specjalny (inicjuj cy) o nazwie init.py server/ # przykªad pakietu init.py # inicjacja config/ # pakiet skªadowy init.py models.py # moduª simulator/ init.py camera.py radar.py nazwy moduªów wykorzystuj kropki import server.simulator.camera # import module Plik init.py musi istnie, nawet gdy nie jest potrzebna inicjacja pakietu (wielko± pliku=0) ( rednio) zaawansowane programowanie w C++ (ZPR) 20/46
cie»ka poszukiwa«moduªów Gdy name jest doª czany, poszukuje si plików w katalogach: lokalnym, zawieraj cym uruchomiony skrypt innych, katalogi s przechowywane w zmiennej sys.path import sys print sys.path # drukuje aktualne ±cie»ki aby doda ±cie»k, mo»na ustawi zmienn ±rodowiskow PYTHONPATH ( rednio) zaawansowane programowanie w C++ (ZPR) 21/46
Standardowe pakiety a - dostarczane wraz z interpreterem dokumentacja: http://docs.python.org/library/ string re struct diib StringIO cstringio textwrap codecs unicodedata stringprep fpformat datetime calendar collections heapq bisect array sets sched mutex Queue weakref UserDict UserList UserString types new copy pprint repr numbers math cmath decimal fractions random itertools functools operator os.path leinput stat statvfs lecmp temple glob fnmatch linecache shutil dircache macpath pickle cpickle copy_reg shelve marshal anydbm whichdb dbm gdbm dbhash bsddb dumbdbm sqlite3 zlib gzip bz2 ziple tarle csv CongParser robotparser netrc xdrlib plistlib hashlib hmac md5 sha os io time argparse optparse getopt logging logging.cong logging.handlers getpass curses curses.textpad curses.ascii curses.panel platform errno ctypes select threading thread dummy_threading dummy_thread multiprocessing mmap readline rlcompleter subprocess socket ssl signal popen2 asyncore asynchat email json mailcap mailbox mhlib mimetools mimetypes MimeWriter mimify multile rfc822 base64 binhex binascii quopri uu HTMLParser sgmllib htmllib htmlentitydefs xml.parsers.expat xml.dom xml.dom.minidom xml.dom.pulldom xml.sax xml.sax.handler xml.sax.saxutils xml.sax.xmlreader xml.etree.elementtree webbrowser cgi cgitb wsgiref urllib urllib2 httplib ftplib poplib imaplib nntplib smtplib smtpd telnetlib uuid urlparse SocketServer BaseHTTPServer SimpleHTTPServer CGIHTTPServer cookielib Cookie xmlrpclib SimpleXMLRPCServer DocXMLRPCServer audioop imageop aifc sunau wave chunk colorsys imghdr sndhdr ossaudiodev gettext locale cmd shlex Tk Tkinter ttk Tix ScrolledText turtle IDLE Packages pydoc doctest unittest translation test test.test_support bdb pdb Commands Prolers hotshot timeit trace sys syscong future_builtins warnings contextlib abc atexit traceback gc inspect site user fpectl distutils code codeop rexec Bastion imp imputil zipimport pkgutil modulender runpy parser ast symtable symbol token keyword tokenize tabnanny pyclbr py_compile compileall dis pickletools i wiele innych ( rednio) zaawansowane programowanie w C++ (ZPR) 22/46
automatyczna instalacja pakietów kilka tysi cy pakietów dost pnych w repozytorium Package Index. pypi.python.org Dost pne s narz dzia do automatycznego instalowania pakietów przechowywanych w tym repozytorium zainstalowa setuptools dla odpowiedniej wersji interpretera http://pypi.python.org/pypi/setuptools#downloads run the egg: sh setuptools-version.egg Nast pnie: pip install package_name wersja pakietu jest wybierana automatycznie (najcz ±ciej najnowsza) ( rednio) zaawansowane programowanie w C++ (ZPR) 23/46
Š czenie C++ i a ( rednio) zaawansowane programowanie w C++ (ZPR) 24/46
Potrzeba u»ycia ró»nych j zyków w aplikacjach (patrz wykªad 1) System komputerowy zawsze: ma ograniczenia czasowe, wi c tworzenie caªo±ci powinno by mo»liwie szybkie posiada pewne elementy, które s w skim gardªem - powinny by zaimplementowane wydajnie (20% kodu) System komputerowy cz sto: posiada pewne elementy, których autor nie chce udost pnia (kod ukryty przed u»ytkownikiem) posiada pewne fragmenty, które powinny by dost pne dla u»ytkownika (aby dostosowa aplikacj do indywidualnych potrzeb, np. konguracja) ( rednio) zaawansowane programowanie w C++ (ZPR) 25/46
powody rozszerzania a w C++ kod wykonywany jest szybciej wykorzystanie istniej cego kodu kod jest ukryty przed u»ytkownikiem powody osadzania a w C++ brak potrzeby kompilacji wykorzystanie bibliotek a kod dost pny dla u»ytkownika Interfejsy: C API Boost ( rednio) zaawansowane programowanie w C++ (ZPR) 26/46
Przykªady Rozszerzanie a w C++: utworzenie biblioteki dzielonej zawieraj cej funkcje w C++ import biblioteki do a i wykonanie Przykªad: hello world Osadzanie a w C++ (Boost ): Przykªad: embedding ( rednio) zaawansowane programowanie w C++ (ZPR) 27/46
Zadanie dodatkowe (dodatkowe 10 pkt) Zadanie nieobowi zkowe, omówione cz ±ciowo na wykªadzie 1. Napisa przykªadow, prost aplikacj, która wykorzystuje /C++/JavaScript. Aplikacja powinna kompilowa si i dziaªa na ró»nych systemach operacyjnych (np. Linux, Windows), wykorzystywa przegl dark jako graczny interfejs u»ytkownika. ( rednio) zaawansowane programowanie w C++ (ZPR) 28/46
Dodatkowa lektura (http://staff.elka.pw.edu.pl/~rnowak2/rnbib.html): R. Nowak, Biblioteka Boost.. Š czenie C++ i a, Software Developer's Journal, 2011. R. Nowak, Wydajne i elastyczne programy. Š czenie C++ i a przy pomocy Boost., Programista, 2012. R. Nowak, Komunikacja z serwerem w aplikacjach ex, Programista, no. 7, pp. 52 54, 2012. R. Nowak, Aplikacje internetowe wykorzystuj ce python. biblioteki up, web2py, django, Programista, no. 13, pp. 66 69, 2013. ( rednio) zaawansowane programowanie w C++ (ZPR) 29/46
Przykªadowe zadania ( rednio) zaawansowane programowanie w C++ (ZPR) 30/46
Wzorce projektowe Przykªadowe zadania Wzorce kreacyjne (tworzenie obiektów) fabryka obiektów fabryka abstrakcyjna prototyp singleton wzorce strukturalne (budowa obiektów) adapter fasada proxy kompozyt dekorator wzorce czynno±ciowe (wspóªpraca pomi dzy obiektami) polecenie, komenda wizytator wielometoda obserwator iterator ( rednio) zaawansowane programowanie w C++ (ZPR) 31/46
Przykªadowe zadania i uzupeªnienie wiadomo±ci o C++ staªo±, 'const', 'mutable' polimorzm, funkcje wirtualne, dziedziczenie wielobazowe dynamiczna informacja o typie ró»ne strategie obsªugi bª dów, mechanizm wyj tków sprytne wska¹niki: std::unique_ptr, std::auto_ptr (wycofywany) std::shared_ptr, boost::shared_ptr std::weak_ptr, boost::weak_ptr boost::scoped_ptr, boost::scoped_array boost::intrusive_ptr referencja do r-warto±ci w C++11 (r-value reference) ( rednio) zaawansowane programowanie w C++ (ZPR) 32/46
Przykªadowe zadania Przykªadowe zadania ( rednio) zaawansowane programowanie w C++ (ZPR) 33/46
Przykªadowe zadania Zad1 - zaproponuj implementacj 'readfromstream' wczytuje ona kolekcj pracowników ze strumienia (hierarchia taka jak na rysunku). Deklaracje s zaproponowane poni»ej. enum PracownikTyp { SEZNONOWY, SPECJALISTA, KIEROWNIK}; typedef boost::shared_ptr<pracownik> PracownikPtr; typedef std::vector<pracownikptr> Pracownicy; Pracownicy readfromstream(std::istream& iys); ( rednio) zaawansowane programowanie w C++ (ZPR) 34/46
Przykªadowe zadania typedef boost::shared_ptr<pracownik> PracownikPtr; class UnknownTypeException : public std::exception { }; class PracownikFactory { public: typedef PracownikPtr (*PracownikCreateFun)(); static PracownikFactory& getinstance() { static PracownikFactory instance; return instance; } void regist(int t, PracownikCreateFun fun) { creators_.insert( std::pair<int,pracownikcreatefun>(t,fun) ); } PracownikPtr create(std::istream& is) { int typ; is >> typ; Creators::const_iterator it = creators_.find(typ); if(it!= creators_.end() ) return it->second(); else throw UnknownTypeException(); } private: typedef std::map<int,pracownikcreatefun> Creators; Creators creators_; }; ( rednio) zaawansowane programowanie w C++ (ZPR) 35/46
Zad1 - przykªadowe rozwi zanie Przykªadowe zadania typedef std::vector<pracownikptr> Pracownicy; Pracownicy readfromstream(std::istream& is) { Pracownicy out; while(is) { try { PracownikPtr p = PracownikFactory::getInstance().create(is); out.push_back(p); } catch(unknowntypeexception&) {} } return out; } ( rednio) zaawansowane programowanie w C++ (ZPR) 36/46
Przykªadowe zadania class File { std::string name_; int size_; public: File(std::string n, int s) : name_(n), size_(s) {} std::string getname() const { return name_; } int getsize() const { return size_; } ~File(){} }; class Dir { typedef File* Child; typedef std::vector<child> Children; std::string name_; Children ch_; public: Dir(const std::string& n) : name_(n) {} std::string getname() const { return name_; } int getsize() const { int size = 0; for(children::const_iterator i=ch_.begin(); i!=ch_.end();++i) size += (*i)->getsize(); return size; } void add(child el) { ch_.push_back(el); } ~Dir() { for(children::iterator i=ch_.begin(); i!=ch_.end();++i) delete *i; } }; ( rednio) zaawansowane programowanie w C++ (ZPR) 37/46
Przykªadowe zadania Zad3 - poda napis, który zostanie wydrukowany M m; D1* d1 = &m; cout << m.f() << d1->f() << static_cast<d2&>(m).f() << static_cast<b&>(m).f() << flush; struct B { virtual int f() { return 1; } }; struct D1 : virtual public B { virtual int f() { return 2; } }; struct D2 : virtual public B { }; struct M : public D1, public D2 { virtual int f() { return 3; } }; ( rednio) zaawansowane programowanie w C++ (ZPR) 38/46
Przykªadowe zadania try { h(); } catch(const std::exception&) { std::cout << 'c'; } catch(const E& e) { std::cout << e.c_; } Ile razy zostanie wywoªany destruktor klasy X Je»eli denicja typu PX zostanie zmieniona na nast puj c : typedef X* PX;, to ile razy zostanie wywoªany destruktor klasy X struct E : public std::exception { char c_; E(char c):c_(c){} }; struct X { char c_; X(char c):c_(c){cout << c_;} ~X(){ std::cout << c_; } }; typedef std::auto_ptr<x> PX; PX f(char c){ return PX(new X(c) );} void g(const PX& px){ throw E(px->c_);} void h() { PX pa = f('a'); try { PX pb = pa; g(f('b'));} catch(const E& e){ cout << e.c_;throw;} } ( rednio) zaawansowane programowanie w C++ (ZPR) 39/46
Przykªadowe zadania Wekt2D w1(1,1), w2(2); assert( w1 + w2 == Wekt2D(3,1) ); class Wekt2D { public: explicit Wekt2D(int dx = 0, int dy ) : dx_(dx), dy_(dy) {} int getdx() { return dx_; } int getdy() { return dy_; } Wekt2D& operator+=(const Wekt2D& w) { Wekt2D o; o.dx_ = w.dx_ + dx_; o.dy_ = w.dy_ = dy_; return o; } Wekt2D& operator+(wekt2d& w) const { Wekt2D o(*this); o += w; return o; } int operator==(wekt2d w) const { return dy_ == w.dy_; } private: int dx_, dy_; }; std::ostream& operator<<(std::ostream os, Wekt2D w) { os << ( << w.getdx() <<, << w.getdy() << ) ; } ( rednio) zaawansowane programowanie w C++ (ZPR) 40/46
Przykªadowe zadania class Wekt2D { public: explicit Wekt2D(int dx = 0, int dy = 0) : dx_(dx), dy_(dy) {} int getdx() const { return dx_; } int getdy() const { return dy_; } Wekt2D& operator+=(const Wekt2D& w) { dx_ += w.dx_; dy_ += w.dy_; return *this; } Wekt2D operator+(const Wekt2D& w) const { Wekt2D o(*this); o += w; return o; } bool operator==(const Wekt2D& w) const { return dx_ == w.dx_ && dy_ == w.dy_; } private: int dx_, dy_; }; std::ostream& operator<<(std::ostream& os, const Wekt2D& w) { os << "(" << w.getdx() << "," << w.getdy() << ")"; return os; } ( rednio) zaawansowane programowanie w C++ (ZPR) 41/46
Przykªadowe zadania Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty string FindAddr( list<employee> l, string name ) { for( list<employee>::iterator i = l.begin(); i!= l.end(); i++ ) if( *i == name ) return (*i).addr; return ""; } ( rednio) zaawansowane programowanie w C++ (ZPR) 42/46
Przykªadowe zadania Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty string FindAddr( list<employee> l, string name ) { for( list<employee>::iterator i = l.begin(); i!= l.end(); i++ ) if( *i == name ) return (*i).addr; return ""; } string FindAddr( const list<employee>& l, const string& name ) { string addr; for( list<employee>::iterator i = l.begin(); i!= l.end(); ++i ) if( i->name() == name ){ addr = (*i).addr; break; } return addr; } ( rednio) zaawansowane programowanie w C++ (ZPR) 43/46
Przykªadowe zadania Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty string FindAddr( list<employee> l, string name ) { for( list<employee>::iterator i = l.begin(); i!= l.end(); i++ ) if( *i == name ) return (*i).addr; return ""; } string FindAddr( const list<employee>& l, const string& name ) { string addr; for( list<employee>::iterator i = l.begin(); i!= l.end(); ++i ) if( i->name() == name ){ addr = (*i).addr; break; } return addr; } list<employee>::const_iterator it = find_if(l.begin(), l.end(), bind(&employee::name,_1) == name); ( rednio) zaawansowane programowanie w C++ (ZPR) 44/46
Przykªadowe zadania Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty string FindAddr( list<employee> l, string name ) { for( list<employee>::iterator i = l.begin(); i!= l.end(); i++ ) if( *i == name ) return (*i).addr; return ""; } string FindAddr( const list<employee>& l, const string& name ) { string addr; for( list<employee>::iterator i = l.begin(); i!= l.end(); ++i ) if( i->name() == name ){ addr = (*i).addr; break; } return addr; } list<employee>::const_iterator it = find_if(l.begin(), l.end(), bind(&employee::name,_1) == name); auto it = find_if(l.begin(), l.end(), [&](Employee& e) return e.name == name;); ( rednio) zaawansowane programowanie w C++ (ZPR) 45/46
Przykªadowe zadania Dzi kuj ( rednio) zaawansowane programowanie w C++ (ZPR) 46/46