You are on page 1of 70

STL(Standard Template Library ) |1

TNG QUAN V TH VIN CHUN STL

I. GII THIU TH VIN CHUN STL


C++ c nh gi l ngn ng mnh v tnh mm do, gn gi vi ngn ng my. Ngoi ra, vi kh nng lp trnh theo mu ( template ), C++ khin ngn ng lp trnh tr thnh khi qut, khng c th v chi tit nh nhiu ngn ng khc. Sc mnh ca C++ n t STL, vit tt ca Standard Template Library - mt th vin template cho C++ vi nhng cu trc d liu cng nh gii thut c xy dng tng qut m vn tn dng c hiu nng v tc ca C. Vi khi nim template, nhng ngi lp trnh ra khi nim lp trnh khi lc (generic programming), C++ c cung cp km vi b th vin chun STL. STL gm cc thnh phn chnh: Container (cc b lu tr d liu) l cc cu trc d liu ph bin template ha dng lu tr cc kiu d liu khc nhau. Cc container chia lm 2 loi: o Sequential container (cc ctdl tun t) bao gm list, vector v deque o Asociative container (cc ctdl lin kt) bao gm map, multimap, set v multiset Iterator (bin lp) ging nh con tr, tch hp bn trong container Algorithm (cc thut ton ) l cc hm ph bin lm vic vi cc b lu tr nh thm, xa, sa, truy xut, tm kim, sp xp ... Function object (functor): Mt kiu i tng c th gi nh 1 hm, ng ra y l 1 k thut nhng trong STL n c nng cao v kt hp vi cc algorithm Cc adapter (b tng thch) , chia lm 3 loi: o container adapter (cc b tng thch lu tr) bao gm stack, queue v priority_queue o iterator adapter (cc b tng thch con tr) o function adapter (cc b tng thch hm)

Nhng thnh phn ny lm vic chung vi cc thnh phn khc cung cp cc gii php cho cc vn khc nhau ca chng trnh. B th vin ny thc hin ton b cc cng vic vo ra d liu (iostream), qun l mng (vector), thc hin hu ht cc tnh nng ca cc cu trc d liu c bn (stack, queue, map, set...). Ngoi ra, STL cn bao gm cc thut ton c bn: tm min, max, tnh tng, sp xp (vi nhiu thut ton khc nhau), thay th cc phn t, tm kim (tm kim thng v tm kim nh phn), trn. Ton b cc tnh nng nu trn u c cung cp di dng template nn vic lp trnh lun th hin tnh khi qut ha cao. Nh vy, STL lm cho ngn ng C++ tr nn trong sng hn nhiu. c im th vin STL l c h tr trn cc trnh bin dch c hai mi trng WINDOWS ln UNIX, v vy nn khi s dng th vin ny trong x l thun tin cho vic chia s m ngun vi cng ng pht trin. V th vin chun c thit k bi nhng chuyn gia hng u v c chng minh tnh hiu qu trong lch s tn ti ca n, cc thnh phn ca th vin ny c khuyn co s dng thay v dng nhng phn vit tay bn ngoi hay nhng phng tin cp thp khc. Th d, dng std::vector hay std::string thay v dng kiu mng n thun l mt cch hu hiu vit phn mm c an ton v linh hot hn. Cc chc nng ca th vin chun C++ c khai bo trong namespace std; Di y ta s tm hiu tng thnh phn ca STL

STL(Standard Template Library ) |2 II. NHP XUT VI IOSTREAM


Nh chng ta s thy, C++ s dng nhp/xut kiu an ton (type safe). Vic nhp/xut c thc hin mt cch t ng theo li nhy cm v kiu d liu. Mi thao tc nhp xut c c nh ngha thch hp x l mt kiu d liu c th th hm c gi x l kiu d liu . Nu khng c i snh gia kiu ca d liu hin ti v mt hm cho vic x l kiu d liu , mt ch dn li bin dch c thit lp. V th d liu khng thch hp khng th "lch" qua h thng. Cc c tnh nhp xut m t theo hng i tng. Ngi dng c th ch nh nhp/xut ca cc kiu d liu t nh ngha cng nh cc kiu d liu chun. Kh nng m rng ny l mt trong cc c tnh quan trng ca C++. 1.CC LP STREAM C++ s dng khi nim dng tin (stream) v a ra cc lp dng tin t chc vic nhp xut. Dng tin c th xem nh mt dy cc byte. Thao tc nhp l ly (c) cc byte t dng tin (khi gi l dng nhp - input) vo b nh. Thao tc xut l a cc byte t b nh ra dng tin (khi gi l dong xut - output). Cc thao tc ny l c lp thit b. thc hin vic nhp, xut ln mt thit b c th, chng ta ch cn gn dng tin vi thit b ny. Khi nm stream:

chui byte, kt thc bi k hiu end_of_file Input: t bn phm, a... v o b nh Output: t b nh ra mn hnh, my in... file cng c coi l mt dng Lp streambuf l c s cho tt c cc thao tc vo ra bng ton t, n nh ngha cc c trng c bn ca cc vng m lu tr cc k t xut hayn hp. Lp ios l lp dn xut t streambuf , ios nh ngha cc dng c bn v kh nng kim tra li dng cho streambuf . ios l lp c s o cho cc lp istream v ostream. Mi lp ny c nh ngha chng ton t << v >> cho cc kiu d li u c s khc nhau. C 4 lp quan trng cn nh l: + Lp c s ios + T lp ios dn xut n 2 lp istream v ostream + Hai lp istream v ostream li dn xut ti lp iostream S k tha gia cc lp nh sau:

STL(Standard Template Library ) |3


Lp ios + Thuc tnh ca lp: Trong lp ios nh ngha cc thuc tnh c s dng lm cc c nh dng cho vic nhp xut v cc c kim tra li (xem bn di). + Cc phng thc: Lp ios cung cp mt s phng thc phc v vic nh dng d liu nhp xut, kim tra li (xem bn di). Lp istream Lp ny cung cp ton t nhp >> v nhiu phng thc nhp khc (xem bn di) nh cc phng thc: get, getline, read, ignore, peek, seekg, tellg,... Lp ostream Lp ny cung cp ton t xut << v nhiu phng thc xut khc (xem bn di) nh cc phng thc: put, write, flush, seekp, tellp,... Lp iostream Lp ny tha k cc phng thc nhp xut ca cc lp istream v ostream.

Th vin iostream ca C++ cung cp hng trm kh nng ca nhp/xut. Mt vi tp tin header cha cc phn ca giao din th vin: Phn ln chng trnh C++ thng include tp tin header <iostream> m cha cc thng tin c bn i hi tt c cc thao tc dng nhp/xut: dng nhp chun ni vi thit b nhp chun Standard input (cin) dng xut chun ni vi thit b xut chun Standard output (cout) dng bo li - ni vi thit b bo li chun: Khng c b nh m ( unbuffered error ) cerr C dng b nh m ( buffered error ) clog Header <iomanip> cha thng tin hu ch cho vic thc hin nhp/xut nh dng vi tn gi l cc b x l dng biu hin bng tham s (parameterized stream manipulators). Header <fstream> cha cc thng tin quan trng cho cc thao tc x l file do ngi dng kim sot. Header <strstream> cha cc thng tin quan trng cho vic thc hin cc nh dng trong b nh. iu ny tng t x l file, nhng cc thao tc nhp/xut ti v t mng cc k t hn l file. Header <stdiostream.h> kt hp kiu nhp/xut c ca C vi C++ theo hng i tng. 2. NHP XUT C BN VI TON T >> V << 3. NHP K T V CHUI K T Chng ta nhn thy ton t nhp >> ch tin li khi dng nhp cc gi tr s (nguyn, thc). nhp k t v chui k t nn dng cc phng thc sau (nh ngha trong lp istream): istream::get(); istream::getline(); istream::ignore(); 3.1. Phng thc get C 3 dng (thc cht c 3 phng thc cng c tn get):

STL(Standard Template Library ) |4


Dng 1: int istream::get() ; Cch thc c ca get() c th minh ho qua v d sau: char ch; ch = cin.get(); + Nu g ABC<Enter> th bin ch nhn m k t A, cc k t BC<Enter> cn li trn dng vo. + Nu g A<Enter> th bin ch nhn m k t A, k t <Enter> cn li trn dng vo. + Nu g <Enter> th bin ch nhn m k t <Enter> (bng 10) v dng vo rng. Dng 2: istream& istream::get(char &ch) ; char c tham chiu bi ch. Ch : + Cch thc c ca get dng 2 cng ging nh dng 1 + Do get() dng 2 tr v tham chiu ti istream, nn c th s dng cc phng thc get() dng 2 ni ui nhau v cng c th kt hp vi ton t >>. V d: cin.get(ch1); cin.get(ch2); cin.get(ch3); c th vit chung trn mt cu lnh sau: cin.get(ch1).get(ch2) >> ch3; Dng 3: istream& istream::get(char *str, int n, char delim = \n); Dng c mt dy k t (k c khong trng) v a vo vng nh do str tr ti. Qu trnh c kt thc khi xy ra mt trong 2 tnh hung sau: + Gp k t gii hn (cho trong delim). K t gii hn mc nh l \n (Enter) + nhn (n-1) k t Ch : + K t kt thc chui \0 c b sung vo dy k t nhn c + k t gii hn vn cn li trn dng nhp dnh cho cc lnh nhp tip theo. + Cng ging nh get() dng 2, c th vit cc phng thc get() dng 3 ni ui nhau trn mt dng lnh, v cng c th kt hp vi ton t >> + K t <Enter> cn li trn dng nhp c th lm tri phng thc get() dng 3. V d xt on chng trnh: char ht[25], qq[20], cq[30]; cout << \nH tn: ; cin.get(ht,25); cout << \nQu qun: ; cin.get(qq,20); cout << \nC quan: ; cin.get(cq,30); cout <<\n <<ht<< <<qq<< <<cq; on chng trnh dng nhp h tn, qu qun v c quan. Nu g: Pham Thu Huong<Enter>

STL(Standard Template Library ) |5


th cu lnh get() u tin s nhn c chui Pham Thu Huong ct vo mng ht. K t <Enter> cn li s lm tri 2 cu lnh get tip theo. Do cu lnh cui cng s ch in ra Pham Thu Huong. khc phc tnh trng trn, c th dng mt trong cc cch sau: + Dng phng thc get() dng 1 hoc dng 2 ly ra k t <Enter> trn dng nhp trc khi dng get (dng 3). + Dng phng thc ignore ly ra mt s k t khng cn thit trn dng nhp trc khi dng get dng 3. cin.ignore(n) ; // Ly ra (loi ra hay b qua) n k t trn dng nhp. Nh vy c th nhp c c qu qun v c quan, cn sa li on chng trnh trn nh sau: char ht[25], qq[20], cq[30]; cout << \nH tn: ; cin.get(ht,25); cin.get(); // Nhn <Enter> cout << \nQu qun: ; cin.get(qq,20); cin.ignore(1); // B qua <Enter> cout << \nC quan: ; cin.get(cq,30); cout <<\n <<ht<< <<qq<< <<cq; 3.2. Phng thc getline Tng t nh get dng 3, c th dng getline nhp mt dy k t t bn phm. Phng thc ny c m t nh sau: istream& istream::getline(char *str, int n, char delim = \n); Phng thc u tin lm vic nh get dng 3, sau n loi <Enter> ra khi dng nhp (k t <Enter> khng a vo dy k t nhn c). Nh vy c th dng getline nhp nhiu chui k t (m khng lo ngi cc cu lnh nhp tip theo b tri). V d on chng trnh nhp h tn, qu qun v c quan bn trn c th vit nh sau (bng cch dng getline): char ht[25], qq[20], cq[30]; cout << \nH tn: ; cin.getline(ht,25); cout << \nQu qun: ; cin.getline(qq,20); cout << \nC quan: ; cin.get(cq,30); cout <<\n <<ht<< <<qq<< <<cq; Ch : Cng ging nh get() dng 2 v get() dng 3, c th vit cc phng thc getline() ni ui nhau trn mt dng lnh hoc kt hp vi ton t >> 3.3. Nhp ng thi gi tr s v k t Nh ni trong 2, ton t nhp >> bao gi cng li k t <Enter> trn dng nhp. K t <Enter> ny s lm tri cc lnh nhp k t hoc chui k t bn di. Do vy cn dng:

STL(Standard Template Library ) |6


hoc ignore(); hoc get() dng 1 hoc get() dng 2 loi b k t <Enter> cn li ra khi dng nhp trc khi thc hin vic nhp k t hoc chui k t. 4.CC HM THNH VIN KHC Cc hm thnh vin khc ca istream Hm ignore dng b qua (loi b) mt s k t trn dng nhp. istream& ignore(int n = 1, int delim = EOF);//b qua n n k t hoc n lc bt gp eof. Hm putback(): istream& putback(char ch); t mt k t ngc li dng nhp Hm peek(): int peek(); Hm tr v k t k tip m khng trch n t dng.

Cc hm thnh vin khc ca ostream Xut k t bng hm thnh vin put ostream& put(char ch); C th gi lin v d cout.put( 'A' ).put( '\n' ); khi ton t du chm(.) c tnh t tri sang phi ng b dng nhp v dng xut

Mc nh cin v cout c ng b: std ::cin.tie (&std ::cout); do ta thy nhng g c nhp vo bn phm khng cn qua b m m hin ngay ln mn hnh. ng b cc cp IO khc ta cng dng c php instream.tie( &outstream );( instream v outstream l tn stream ) b ng b: instream.tie( 0 ); Nhp xut khng nh dng Nhp/xut mc thp (ngha l nhp/xut khng nh dng) ch nh c th s byte no phi c di chuyn hon ton t thit b ti b nh hoc t b nh ti thit b. V khng c cc x l trung gian nn cung cp tc v dung lng cao, nhng cch ny khng tin li lm cho lp trnh vin. Nhp/xut khng nh dng c thc hin vi cc hm thnh vin istream::read() v ostream::write().

Hm istream::read(): istream& read(unsigned char* puch, int nCount); Trch cc byte t dng cho n khi gii hn nCount t n hoc cho n khi end- of-file t n. Hm ny c ch cho dng nhp nh phn.

Hm ostream::write():

STL(Standard Template Library ) |7


ostream& write(const unsigned char* puch, int nCount); Chn nCount byte vo t vng m (c tr bi puch v psch) vo dng. Nu file c m ch text, cc k t CR c th c chn vo. Hm ny c ch cho dng xut nh phn. Chng hn: char Buff[]="HAPPY BIRTHDAY"; cout.write(Buff,10); Hm int istream::gcount() tr v s k t trch bi hm nhp khng nh dng cui cng.

5.CC TRNG THI DNG Khi nim c: cha trong mt bit, c 2 trng thi: Bt (on) c gi tr 1 Tt (off) c gi tr 0 Mi stream lu gi nhng c trng thi cho ta bit thao tc nhp, xut c thnh cng hay khng, v nguyn nhn gy li. Cc c ny, cng nh c nh dng, thc cht l cc phn t ca 1 vector bit ( 1 s nguyn ). Chng bao gm. goodbit: bt khi khng c li xy ra v cc c khc u tt. eofbit: bt khi gp end-of-file. failbit: bt khi vic nhp tr nn khng chnh xc nhng stream vn n. V d nh thay v nhp s nguyn th ngi dng li nhp k t. badbit: bt khi bng cch no stream b hng v mt d liu.

Cc c trn c th c truy xut thng qua cc hm tng ng: good(), eof(), fail() v bad() Bn c th ly ton b cc c bng hm ios::iostate rdstate(); Xem v d bn di: int x; cout << "Enter an integer: "; cin >> x; // The state of the stream can be gotten with rdstate. ios::iostate flags = cin.rdstate(); // We can test for which bits are set as follows. // Note the use of the bitwise & operator. // It's usually easier to test the bits directly: if (flags & ios::failbit) cout << "failbit set." << endl; else cout << "failbit not set." << endl; if (flags & ios::badbit) cout << "badbit set." << endl; else cout << "badbit not set." << endl; if (flags & ios::eofbit) cout << "eofbit set." << endl; else cout << "eofbit not set." << endl; if (cin.good()) cout << "Stream state is good." << endl; else cout << "Stream state is not good." << endl; if (cin.fail())

STL(Standard Template Library ) |8


cout << "Are you sure you entered an integer?" << endl; else cout << "You entered: " << x << endl; Bn c th t li cc c trng thi bng phng thc clear(): void clear(ios::iostate flags = ios::goodbit ); Phng thc ny s reset ton b cc bit v 0 v bt c flags. VD: cin.clear() s a trng thi dng v OK, cin.clear(ios::failbit) s bt failbit ( xa nhng ci khc ) cn cin.clear( ios::failbit | ios::badbit) s bt failbit v badbit. bt 1 c m khng lm nh hng n c khc, ta dng ton t | vi chnh vector bit: cin.clear( ios::badbit | cin.rdstate()); Hoc hm setstate: void setstate( ios::iostate states) V d: cin.setstate( ios::failbit | ios::badbit) 6.NH DNG XUT 6.1. nh dng gi tr xut nh dng l xc nh cc thng s: - rng quy nh - chnh xc - K t n - V cc thng s khc + rng thc t ca gi tr xut: Nh ni trn, C++ s bin i gi tr cn xut thnh mt chui k t ri a chui ny ra mn hnh. Ta s gi s k t ca chui ny l rng thc t ca gi tr xut. V d: int n=4567, m=-23 ; float x = -3.1416 ; char ht[] = Tran Van Thong ; rng thc t ca n l 4, ca m l 3, ca x l 7, ca ht l 14. + rng quy inh l s v tr ti thiu trn mn hnh dnh in gi tr. Theo mc nh, rng quy nh bng 0. Chng ta c th dng phng thc cout.width() thit lp rng ny. V d: cout.width(8); s thit lp rng quy nh l 8.. + Mi quan h gia rng thc t v rng quy nh - Nu rng thc t ln hn hoc bng rng quy nh th s v tr trn mn hnh cha gi tr xut s bng rng thc t. - Nu rng thc t nh hn rng quy nh th s v tr trn mn hnh cha gi tr xut s bng rng quy nh. Khi s c mt s v tr d tha. Cc v tr d tha s c n (lp y) bng khong trng. + Xc nh k t n: K t n mc nh l du cch (khong trng). Tuy nhin c th dng phng thc cout.fill() chn mt k t n khc. V d: int n=123; // rng thc t l 3 cout.fill(*); // K t n l *

STL(Standard Template Library ) |9


cout.width(5); // rng quy nh l 5 cout << n ; th kt qu in ra l: **123 + chnh xc l s v tr dnh cho phn phn (khi in s thc). chnh xc mc nh l 6. Tuy nhin c th dng phng thc cout.precision() chn chnh xc. V d: float x = 34.455 ; cout.precision(2) ; cout.width(8); cout.fill(0) ; cout << x ; // rng thc t 6 // chnh xc 2 // rng quy c 8 // K t n l s 0

th kt qu in ra l: 0034.46 6.2. Cc phng thc nh dng 6.2.1. Phng thc int cout.width() cho bit rng quy nh hin ti. 6.2.2. Phng thc int cout.width(int n) Thit lp rng quy nh mi l n v tr v rng quy nh trc . rng quy nh n ch c tc dng cho mt gi tr xut. Sau C++ thit lp li bng 0. V d: int m=1234, n=56; cout << \nAB cout.width(6); cout << m ; cout << n ; th kt qu in ra l: B 123456 (gia B v s 1 c 2 du cch). 6.2.3. Phng thc int cout.precision() Cho bit chnh xc hin ti (ang p dng xut cc gi tr thc). 6.2.4. Phng thc int cout.precision(int n) Thit lp chnh xc s p dng l n v cho bit chnh xc trc . chnh xc c thit lp s c hiu lc cho ti khi gp mt cu lnh thit lp chnh xc mi. 6.2.5. Phng thc char cout.fill() Cho bit k t n hin ti ang c p dng. 6.2.6. Phng thc char cout.fill(char ch) Quy nh k t n mi s c dng l ch v cho bit k t n ang dng trc . K t n c thit lp s c hiu lc cho ti khi gp mt cu lnh chn k t n mi. V d : float x=-3.1551, y=-23.45421; cout.precision(2); cout.fill('*'); cout << "\n" ; cout.width(8); cout << x; cout << "\n" ; cout.width(8); cout << y; Sau khi thc hin, chng trnh in ra mn hnh 2 dng sau:

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 10
***-3.16 **-23.45 6.3. C nh dng 6.3.1. Cc c nh dng C th chia cc c thnh cc nhm: Nhm 1 gm cc c nh v (cn l) : -ios::left: Khi bt c ios:left th gi tr in ra nm bn tri vng quy nh, cc k t n nm sau -ios::right: Khi bt c ios:right th gi tr in ra nm bn phi vng quy nh, cc k t n nm trc. -ios::internal: C ios:internal c tc dng ging nh c ios::right ch khc l du (nu c) in u tin Mc nh c ios::right bt. Nhm 2 gm cc c nh dng s nguyn: + Khi ios::dec bt (mc nh): S nguyn c in di dng c s 10 + Khi ios::oct bt : S nguyn c in di dng c s 8 + Khi ios::hex bt : S nguyn c in di dng c s 16 Nhm 3 gm cc c nh dng s thc: ios::f xed ios::scientific ios::showpoint Mc nh: C ios::fixed bt (on) v c ios::showpoint tt (off). + Khi ios::fixed bt v c ios::showpoint tt th s thc in ra di dng thp phn, s ch s phn phn (sau du chm) c tnh bng chnh xc n nhng khi in th b i cc ch s 0 cui. V d nu chnh xc n = 4 th: S thc -87.1500 c in: S thc 23.45425 c in: S thc 678.0 c in: -87.15 23.4543 678

+ Khi ios::fixed bt v c ios::showpoint bt th s thc in ra di dng thp phn, s ch s phn phn (sau du chm) c in ra ng bng chnh xc n. V d nu chnh xc n = 4 th: S thc -87.1500 c in: -87.1500 S thc 23.45425 c in: 23.4543 S thc 678.0 c in: 678.0000 + Khi ios::scientific bt v c ios::showpoint tt th s thc in ra di dng m (dng khoa hc). S ch s phn phn (sau du chm) ca phn nh tr c tnh bng chnh xc n nhng khi in th b i cc ch s 0 cui. V d nu chnh xc n = 4 th: S thc -87.1500 c in: -8.715e+01 S thc 23.45425 c in: 2.3454e+01 S thc 678.0 c in: 6.78e+02 + Khi ios::scientific bt v c ios::showpoint bt th s thc in ra di dng m. S ch s phn phn (sau du chm) ca phn nh tr c in ng bng chnh xc n. V d nu chnh xc n = 4 th:

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 11
S thc -87.1500 c in: -8.7150e+01 S thc 23.45425 c in: 2.3454e+01 S thc 678.0 c in: 6.7800e+01 Nhm 4 gm cc hin th: ios::showpos ios::showbase ios::uppercase C ios::showpos + Nu c ios::showpos tt (mc nh) th du cng khng c in trc s dng. + Nu c ios::showpos bt th du cng c in trc s dng. C ios::showbase + Nu c ios::showbase bt th s nguyn h 8 c in bt u bng k t 0 v s nguyn h 16 c bt u bng cc k t 0x. V d nu a = 40 th: dng in h 8 l: 050 dng in h 16 l 0x28 + Nu c ios::showbase tt (mc nh) th khng in 0 trc s nguyn h 8 v khng in 0x trc s nguyn h 16. V d nu a = 40 th: dng in h 8 l: 50 dng in h 16 l 28 C ios::uppercase + Nu c ios::uppercase bt th cc ch s h 16 (nh A, B, C, ...) c in di dng ch hoa. + Nu c ios::uppercase tt (mc nh) th cc ch s h 16 (nh A, B, C, ...) c in di dng ch thng.

6.3.2. Cc phng thc bt tt c Cc phng thc ny nh ngha trong lp ios. + Phng thc long cout.setf(long f) ; s bt cc c lit k trong f v tr v mt gi tr long biu th cc c ang bt. Thng thng gi tr f c xc nh bng cch t hp cc c trnh by trong mc 6.1. V d: cout.setf(ios::showpoint | ios::scientific) ; s bt cc c ios::showpoint v ios::scientific. + Phng thc long cout.unsetf(long f) ; s tt cc c lit k trong f v tr v mt gi tr long biu th cc c ang bt. Thng thng gi tr f c xc nh bng cch t hp cc c trnh by trong mc 6.1. V d: cout.unsetf(ios::showpoint | ios::scientific) ; s tt cc c ios::showpoint v ios::scientific. + Phng thc long cout.flags(long f) ; c tc dng ging nh cout.setf(long). V d: cout.flags(ios::showpoint | ios::scientific) ; s bt cc c ios::showpoint v ios::scientific. + Phng thc long cout.flags() ;

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 12
s tr v mt gi tr long biu th cc c ang bt.

6.4.Cc b phn nh dng v cc hm nh dng 6.4.1. Cc b phn nh dng (nh ngha trong <iostream.h>) Cc b phn nh dng gm: dec oct hex endl ends flush //nh c ios::dec //nh c ios::oct //nh c ios::hex //xut k t \n (chuyn dng) //xut k t \0 (null) //y d liu ra thit b xut

Chng c tc dng nh c nh dng nhng c vit ni ui trong ton t xut nn tin s dng hn. V d : cout.setf(ios::showbase) cout << "ABC" << endl << hex << 40 << " " << 41; Chng trnh s in 2 dng sau ra mn hnh: ABC 0x28 0x29 6.4.2. Cc hm nh dng ( stream manipulator )

Cc hm nh dng gm: setw(int n) setpecision(int n) setfill(char ch) setiosflags(long l) resetiosflags(long l) // nh cout.width(int n) // nh cout.pecision(int n) // nh cout. fill(char ch) // nh cout.setf(long f) // nh cout.unsetf(long f)

Cc hm nh dng c tc dng nh cc phng thc nh dng nhng c vit ni ui trong ton t xut nn tin s dng hn. Mun s dng cc hm nh dng cn b sung vo u chng trnh ch th #include <iomanip> V d c th thay phng thc cout.setf(ios::showbase) ; bng hm cout << setiosflags(ios::showbase) << ;

7.CC DNG CHUN C 4 dng tin (i tng ca cc lp Stream) nh ngha trc, c ci t khi chng trnh khi ng. Hai dng chun quan trng nht l: cin dng input chun gn vi bn phm, ging nh stdin ca C. cout dng output chun gn vi mn hnh, ging nh stdout ca C. Hai dng tin chun khc: cerr dng output li chun gn vi mn hnh, ging nh stderr ca C. clog ging cerr nhng c thm b m.

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 13
Ch 1: C th dng cc dng cerr v clog xut ra mn hnh nh dng i vi cout. Ch 2: V clog c thm b m, nn d liu c a vo b m. Khi y b m th a d liu t b m ra dng clog. V vy trc khi kt thc xut cn dng phng thc: clog.flush() y d liu t b m ra clog.Clog thng c s dng cho cc ng dng u tin v tc . Chng trnh sau minh ho cch dng dng clog. Chng ta nhn thy, nu b cu lnh clog.flush() th s khng nhn thy kt qu xut ra mn hnh khi chng trnh tm dng bi cu lnh cin.get() float x=-87.1500; clog.setf(ios::scientific); clog.precision(4); clog.fill('*'); clog.width(10); clog << x; clog.flush(); cin.get(); Xut ra my in Trong s 4 dng tin chun khng dng no gn vi my in. Nh vy khng th dng cc dng ny xut d liu ra my in. xut d liu ra my in (cng nh nhp, xut trn tp) cn to ra cc dng tin mi v cho n gn vi thit b c th. to mt dng xut v gn n vi my in ta c th dng mt trong cc hm to sau: ofstream Tn_dng_tin(int fd) ; ofstream Tn_dng_tin(int fd, char *buf, int n) ; Trong : + Tn_dng_tin l tn bin i tng kiu ofstream hay gi l tn dng xut do chng ta t t. + fd (file descriptor) l ch s tp tin. Ch s tp tin nh sn i vi stdprn (my in chun) l 4. + Cc tham s buf v n xc nh mt vng nh n byte do buf tr ti. Vng nh s c dng lm b m cho dng xut. ofstream prn(4) ; s to dng tin xut prn v gn n vi my in chun. Dng prn s c b m mc nh. D liu trc ht chuyn vo b m, khi y b m th d liu s c y t b m ra dng prn. ch ng yu cu y d liu t b m ra dng prn c th s dng phng thc flush hoc b phn nh dng flush. Cch vit nh sau: prn.flush(); // Phng thc prn << flush ; // B phn nh dng Dng chui k t lm b m: char buf[1000] ; ofstream prn(4,buf,1000) ; To dng tin xut prn v gn n vi my in chun. Dng xut prn s dng 1000 byte ca mng buf lm b m. Cc cu lnh di y cng xut d liu ra my in: prn << \nTong = << (4+9) ; // a d liu vo b m prn << \nTich = << (4*9) ; // a d liu vo b m prn.flush() ; // Xut 2 dng ( b m) ra my in Ch : Trc khi kt thc chng trnh, d liu t b m s c t ng y ra my in. 8.THAO TC VI FILE STREAM

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 14
8.1.Cc lp dng nhp, xut d liu ln file Nh ni trn, C++ cung cp 4 dng tin chun lm vic vi bn phm v mn hnh. Mun nhp xut ln tp chng ta cn to cc dng tin mi (khai bo cc i tng Stream) v gn chng vi mt tp c th. C++ cung cp 3 lp stream lm iu ny, l cc lp: ofstream ifstream fstream dng to cc dng xut (ghi tp) dng to cc dng nhp (c tp) dng to cc dng nhp, dng xut hoc dng nhp-xut

S dn xut cc lp nh sau:

8.2.Cch s dng fstream : nh ngha 1 i tng file ta dng c php fstream dataFile; ( y dataFile ch l tn do ngi dng t m thi ) m 1 file ta dng c php sau : dataFile.open("info.txt", ios::out); Hoc n gin truyn tham s v o constructor: fstream dataFile("info.txt", ios::out); y i hi 2 i s : i th nht l 1 chui tn cha tn file. i th 2 l ch ( mode) m file v ci ny cho ta bit ch no m chng ta dng m file. v d trn th tn file l info.txt cn flag file y l ios::out. Ci ny n ni cho C++ bit chng ta m file ch xut ra. Ch xut ra cho php d liu c th c ghi vo file. datafile.open("info.txt", ios::in); Cn v d ny th tc l ta ang m file ch nhp v o, tc l cho php d liu c c v o t file. + Tham s mode c gi tr mc nh l ios::out (m ghi). Tham s ny c th l mt trong cc gi tr sau: ios::binary ios::out ios::app ios::ate ios::trunc ios::nocreate ios::noreplace ghi theo kiu nh phn (mc nh theo kiu vn bn) ghi tp, nu tp c th n b ghi ghi b sung v o cui tp chuyn con tr tp ti cui tp sau khi m tp xo ni dung ca tp nu n tn ti nu tp cha c th khng lm g (b qua) nu tp c th khng lm g (b qua)

Chng ta th s dng nhng ch trn chung vi nhau v chng s c kt ni vi nhau bng ton t |.

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 15
V d: fstream dataFile("info.txt", ios::in | ios::out); Dng lnh trn cho php ta m file info.txt c 2 ch xut v nhp. Ch : Khi dng ring l th ios::out s xa ni dung ca file nu file c to sn. Tuy nhin nu dng chung vi ios::in, th ni dung file c s c gi li. V nu file cha c to, n s to ra 1 file mi cho chng ta lun. 8.3.Cc thap tc c bn Ghi/oc file (nh cout, cin) outClientFile << myVariable inClientFile >> myVariable ng file outClientFile.close(); By gi l 1 v d hon chnh : // This program uses an fstream object to write data to a file. #include <iostream> #include <fstream> using namespace std; int main() { fstream dataFile; cout << "Opening file...\n"; dataFile.open("demofile.txt", ios::out); // M file ghi vo cout << "Now writing data to the file.\n"; dataFile << "Jones\n"; // Ghi dng th 1 dataFile << "Smith\n"; // Ghi dng th 2 dataFile.close(); // ng file cout << "Done.\n"; return 0; }

File Output: J O N E S \n S M I T H H \n <EOF> Khi file c ng li th k t end-of-file s c t ng ghi vo. Khi file li c m ra th ty theo mode con tr s nm u file hoc v tr end-of-file . 8.4.Kim tra file c tn ti hay khng trc khi m i khi chng ta s cn kim tra xem file c tn ti trc khi chng ta m n ra hay khng v sau y l 1 v d: fstream dataFile; dataFile.open("value.txt", ios::in); if(dataFile.fail()) { //Nu file khng tn ti, th to ra 1 file mi dataFile.open("value.txt", ios::out); //... } else dataFile.close();

8.5.Cch truyn 1 file vo hm Chng ta khi lm vic vi nhng chng trnh thc s th i khi chng ta cn phi truyn file stream vo hm no tin cho vic qun l, nhng khi truyn phi lu l lun lun truyn bng tham chiu.

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 16
#include <iostream> #include <fstream> #include <string> using namespace std; bool OpenFile(fstream &file, char *name); void ShowContents(fstream &file); int main() { fstream dataFile; if(!OpenFile(dataFile, "demo.txt")) { cout << "Error !" << endl; return 0; } cout << "Successfully.\n"; ShowContents(dataFile); dataFile.close(); return 0; } bool OpenFile(fstream &file, char *name) { file.open(name, ios::in); if(file.fail()) return false; else return true; } void ShowContents(fstream &file) { string line; while(getline(file, line)){ cout << line << endl; } } 8.6. Cc hm nh v cho file tun t con tr v tr ghi s th t ca byte tip theo c/ghi cc hm t li v tr ca con tr: seekg (t v tr c cho lp istream) seekp (t v tr ghi cho ostream) seekg v seekp lycc i s l offset v mc (offset: s byte tng i k t mc) Mc(ios::beg mc nh) ios::beg - u file ios::cur -v tr hin ti ios::end -cui file cc hm ly v tr hin ti ca con tr: tellg v tellp V d: fileObject.seekg(0) //n u file (v tr 0), mc nh i s th hai l ios::beg fileObject.seekg(n) //n byte th n k t u file fileObject.seekg(n, ios::cur)

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 17
//tin n byte fileObject.seekg(y, ios::end) //li y byte k t cui file fileObject.seekg(0, ios::cur) //n cui file //seekp tng t location = fileObject.tellg() //ly v tr c hin ti ca fileObject 8.7.File nh phn 8.7.1.nh ngha: File nh phn l file cha ni dung khng nht thit phi l ASCII text. Tt c nhng file t u ti gi chng ta thao tc u dng mc nh l text file. C ngha l d liu trong nhng file ny u c nh dng di m ASCII. Thm ch l s i chng na khi n c lu trong file vi ton t << th n c ngm nh chuyn v dng text. V d : ofstream file("num.dat"); short x = 1297; file << x; Dng lnh cui cng ca v d trn s ghi ni dung ca x vo file, chng c lu vo dng k t '1', '2', '9', '7'. Thc s l con s 1297 c lu di dng nh phn, v chim 2 byte trong b nh my tnh. V x kiu short n s c lu nh sau : 00000101 | 00010001 ghi trc tip cc byte chng ta s dng mode ios::binary file.open("stuff.dat", ios::out | ios::binary); 8.7.2.Hm write v read : 8.7.1.1.Write -Hm write dng ghi 1 file stream nh dng nh nhn. Dng tng qut ca hm write nh sau : fileObject.write(address, size); y chng ta c nhng lu sau : -fileObject l tn ca i tng file stream. -address l a ch u tin ca 1 vng nh c ghi vo file. i s ny c th l a ch ca 1 k t hoc l con tr ti kiu char. -size l s lng byte ca v ng nh m n c write. i s ny bt buc phi l kiu integer( s nguyn dng ) Chng ta xt v d sau : char letter = 'A'; file.write(&letter, sizeof(letter));

-i th nht y l a ch ca bin letter. V i ny s ni cho hm write bit rng d liu c ghi vo file u trong vng nh. -i th 2 s l kck thc ca bin letter, v i ny s ni cho hm write bit s lng byte ca d liu s ghi vo file. Bi v d s c lu khc nhau trn tu h thng khc nhau, nn cch tt nht l chng ta dng ton t sizeof quyt nh s bytes c ghi. V sau khi hm ny c thc hin, ni dung ca bin letter s c khi vo file nh phn ca i tng "file".

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 18
Chng ta xem tip 1 v d sau : char data[] = {'A', 'B', 'C', 'D'}; file.write(data, sizeof(data));

Trong v d ny th i th 1 l tn ca mng (data). V khi ta truyn tham s l tn ca mng th tc l ta truyn con tr tr ti v tr u tin ca mng. i th 2 cng c ngha tng t nh v d 1. V sau khi gp ny thc hin th ni dung ca mng s c ghi vo file nh phn tng ng vi i tng file.

8.7.1.2.Read Hm read th s dng c v o s d liu nh phn t file v o b nh my tnh. Dng tng qut l : fileObject.read(address, size); - y fileObject l tn ca i tng file stream. -address l a ch u tin m vng nh m d liu c c vo c lu. V i ny c th l a ch ca 1 k t hay 1 con tr ti kiu char. -size cng l s lng byte trong b nh c c vo t file. V i ny bt buc cng phi l s kiu integer ( nguyn dng ) . Tng t hm read ta cng c 2 v d sau : char letter; file.read(&letter, sizeof(letter)); v : char data[4]; file.read(data, sizeof(data)); Nu chng ta mun ghi cc kiu khc vo file nh phn th ta phi dng c php c t bit sau y. reinterpret_cast<dataType>(value) c php trn th dataType s l kiu d liu m chng ta mun p v, v value s l gi tr m chng ta mun p v dng byte. V d : int x = 65; file.write(reinterpret_cast<char *>(&x), sizeof(x)); i vi mng th : const int SIZE = 10; int numbers[SIZE] = {1,2,3,4,5,6,7,8,9,10}; file.write(reinterpret_cast<charr *>(numbers), sizeof(numbers)); V d: // This program uses the write and read functions. #include <iostream> #include <fstream> using namespace std; int main()

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 19
{ const int SIZE = 10; fstream file; int numbers[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // Open the file for output in binary mode. file.open("numbers.dat", ios::out | ios::binary); // Write the contents of the array to the file. cout << "Writing the data to the file.\n"; file.write(reinterpret_cast<char *>(numbers), sizeof(numbers)); // Close the file. file.close(); // Open the file for input in binary mode. file.open("numbers.dat", ios::in | ios::binary); // Read the contents of the file into the array. cout << "Now reading the data back into memory.\n"; file.read(reinterpret_cast<char *>(numbers), sizeof(numbers)); // Display the contents of the array. for (int count = 0; count < SIZE; count++) cout << numbers[count] << " "; cout << endl; // Close the file. file.close(); return 0; }

9. NH NGHA TON T << V >> CA BN Nh ni, nhp xut trong C++ rt mnh, nh c ch a nng ha ton t, C++ cho php ta nh ngha nhp xut i vi cc kiu d liu t to. Ton t >> c a nng ha c prototype: ostream & operator << (ostream & stream, ClassName Object); Hm ton t << tr v tham chiu ch n dng xut ostream. Tham s th nht ca hm ton t << l mt tham chiu ch n dng xut ostream, tham s th hai l i tng c chn vo dng. Khi s dng, dng trao cho ton t << (tham s th nht) l ton hng bn tri v i tng c a vo dng (tham s th hai) l ton hng bn phi. Ta s s dng ton t ny vi i s th nht l ostream nn n khng th l 1 hm thnh vin. Cn hm ton t ca ton t >> c a nng ha c prototype nh sau: istream & operator >> (istream & stream, ClassName Object); Hm ton t >> tr v tham chiu ch n dng nhp istream. Tham s th nht ca hm ton t ny l mt tham chiu ch n dng nhp istream, tham s th hai l i tng ca lp ang xt m chng ta mun to dng nh vo d liu ly t dng nhp. Khi s dng, dng nhp ng vai ton hng bn tri, i tng nhn d liu ng vai ton hng bn phi. Cng nh trng hp ton t <<, hm ton t >> khng l hm thnh vin ca lp. Thng thng 2 ton t ny c cp quyn friend. V d vi lp point:

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 20
#include<iostream> class point { int x,y; public: friend ostream & operator << (ostream & Out,const point & P); friend istream & operator >> (istream & In,point & P); }; ostream & operator << (ostream & out,const point & p) { out << "( "<< p.x << " , " << p.y << " )"; return out; //Cho php cout << a << b << c; } istream & operator >> (istream & in,point & p) { char c; in >> p.x >> c >> p.y; return in; } int main() { point p; cin >> p; cout << "Toa do: " << p; return 0; } 10.STRING STREAM Th vin chun cng cho php nhp xut d liu t 1 chui k t c sn trong b nh.Tnh nng ny c cung cp trong header strstream. V cch s dng, string stream cng c constructor v cc mode nh file stream: strstream::strstream( char *, int, ios_base::openmode = ios_base::in|ios_base::out ) i s th nht l mng lu b m. i s th 2 l kch thc ti a ca b m. i s th 3 l mode. Cng nh file, string stream c 3 loi: istrstream ostrstream strstream Sau y l 1 v d v s dng osstream i t 1 s nguyn sang 1 chui: #include<iostream> #include <strstream> int main() { long x = 235323429; char buf[10];

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 21
ostrstream oss(buf,10,ios::out); oss << x << ends; //ends i din cho k t null cout << oss.str();//cout << buf; cout << "\nSo ky tu la: " << oss.pcount(); cout << "\nDia chi buffer: " << (void*)oss.rdbuf(); return 0; }

III. CONTAINER & ITERATOR 1. Tng quan v container


Container (thng cha) l khi nim ch cc i tng lu tr cc i tng (gi tr) khc. i tng container s cung cp cc phng thc truy cp cc thnh phn (element) ca n. Container no cng c cc phng thc sau y:

Phng thc size() empty () max_size() == != begin() end() front() back() swap()

M t S lng phn t Tr v 1 nu container rng, 0 nu ngc li. Tr v s lng phn t ti a c cp pht Tr v 1 nu hai container ging nhau Tr v 1 nu hai container khc nhau Tr v con tr n phn t u tin ca container Tr v con tr n phn t cui cng ca container Tr v tham chiu n phn t u tin ca container Tr v tham chiu n phn t cui cng ca container Hon i 2 container vi nhau (ging vic hon i gi tr ca 2 bin)

Cc container chia lm 2 loi: o o Container Bitset deque list map multimap multiset priority_queue set Sequential container (cc ctdl tun t) bao gm list, vector v deque Asociative container (cc ctdl lin kt) bao gm map, multimap, set v multiset M t Mt chui bit Hng i Danh sch tuyn tnh Lu tr cp kha/gi tr m trong mi kha ch c kt hp vi 1 gi tr. Lu tr cp kha/gi tr m trong mt kha c th kt hp vi 2 hay nhiu hn 2 gi tr. Mt tp hp m trong cc phn t c th ging nhau ( theo 1 cch so snh no ) Mt hng i u tin. Mt tp hp ( trong mi phn t l duy nht - theo 1 cch so snh no ) Header <bitset> <queue> <list> <map> <map > <set> <queue> <set>

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 22
stack vector Mt ngn xp. Mng ng <stack> <vector>

Bi v tn kiu s dng trong container nm trong mt lp template khai bo ty , do cc kiu ny c khai bo typedef thnh cc tn v c ngha.Cc tn ny lm cho nh ngha cc container kh chuyn hn Mt vi tn typedef ph bin c a ra trong bng sau: Typedef Name size_type reference const_reference iterator const_iterator reverse_iterator const_reverse_iterator value_type allocator_type key_type key_compare value_compare M t Mt s nguyn ( tng ng size_t ) Mt tham chiu n 1 phn t Mt tham tr n mt phn t. Mt bin lp Mt tham tr lp Mt bin lp ngc Mt tham tr lp ngc Kiu d liu c lu tr trong container Kiu ca allocator. Kiu ca kha. Loi hm so snh 2 kha Loi hm so snh 2 gi tr.

Mc d khng th xem xt k tt c cc loi container trong chng ny, nhng phn sau s nghin cu k 3 i din: vector, list, map v 1 th hin hu dng ca vector l string. Mt khi bn hiu c cch m nhng container ny lm vic, th bn s khng gp kh khn g trong vic s dng nhng loi khc.

2. Iterator (b lp)
L khi nim s dng ch mt con tr tr n cc phn t trong 1 container. Mi container c mt loi iterator khc nhau. Trong th vin STL th ngi ta tch hp lp i tng Iterator cng v i cc container. T tng th hin nh sau: o o o Cc i tng Iterator l cc con tr n cc i tng ca lp lu tr: typedef__gnu_cxx::__normal_iterator <pointer,vector_type> iterator; Khai bo lp Iterator nh l 1 lp nm trong lp lu tr. Xc nh trong lp lu tr cc phng thc thnh phn nh: begin() tr li con tr kiu i tng Iterartor n phn t u tin ca nm trong i tng lp lu tr.

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 23
end() tr li con tr kiu Iterator tr n 1 i tng no bn ngoi tp cc phn t c lu tr. i tng bn ngoi no c th c cc nh ngha khc nhau.Trong trng hp c th nh vector ta c th hiu l tr n phn t sau phn t cui cng. Xc nh trong lp i tng kiu Iterator cc ton t nh sau: ++p hoc p++ : chuyn iterator p n phn t k tip. --p hoc p-- : chuyn iterator p n phn t ng trc n. *p : xc nh gi tr ca phn t m iterator p tr n.

Nh bn bit, mng v con tr c mi quan h cht ch vi nhau trong C++. Mt mng c th c truy xut thng qua con tr. S tng ng ny trong STL l mi quan h gia iterator v container. N cung cp cho chng ta kh nng x l theo chu k thng qua ni dung ca container theo mt cch ging nh l bn s dng con tr to x l chu k trong mng. Bn c th truy xut n cc thnh phn ca mt container bng s dng mt iterator: <container> coll; for (<container>::iterator it = coll.begin(); it != coll.end(); ++it) { *it .. } Iterator nh ngha th no l phn t u, phn t cui, phn t tip theo ca container, n che i cu trc ni ti v cho php ta vit cc on m tng qut duyt hay chn phn t trn cc container khc nhau m khng cn bit bn trong ca container ra sao. C 5 loi iterator c m t trong bng di. Iterator Random access (RandIter ) Bidirectional ( BiIter ) Forward ( ForIter ) Input ( InIter ) Output ( OutIter ) Quyn truy cp Cha v nhn gi tr. Cc thnh phn c th truy xut ngu nhin Cha v nhn gi tr. Di chuyn ti trc v sau Cha v nhn gi tr. Ch cho php di chuyn ti. Nhn nhng khng lu tr gi tr. Ch cho php di chuyn ti. Cha nhng khng nhn gi tr. Ch cho php di chuyn ti.

Nu container khai bo const, chng ta phi dng const_iterator thay v iterator: const list<string> list1; list<string>::const_iterator i = list1.begin(); STREAM ITERATORS Stream Iteartor cung cp kh nng x l trn dng nhp xut, bn c th thm bt, xa sa trc tip trn stream. Mt v d l nhp v in ra 1 container khng cn v ng for(): vector <int> v (istream_iterator <int>(cin), istream_iterator <int>()); copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));

REVERSE_ITERATOR

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 24
Trong cc reversible container cn nh ngha thm reverse_iterator ( iterator o ngc ). N c nh v tun t theo mt trnh t ngc li vi iterator. V v y, reverse_iterator u tin s tr n cui ca container, tng gi tr ca reverse_iterator s lm n tr n thnh phn ng trc Tng ng vi iterator end() v iterator begin() ta c reverse_iterator rbegin() v reverse_iterator rend(); V d : duyt list theo 2 chiu #include <iostream> #include <list> using namespace std; int main() { int A[] = {3,2,3,1,2,3,5,3}; int n = sizeof(A)/sizeof(*A); list<int> V; for (int i=0; i<n; i++) V.push_back(A[i]); list<int>::iterator vi; cout << endl << "Danh sach theo chieu xuoi" << endl; for (vi=V.begin(); vi!=V.end(); vi++) cout << *vi << endl; list<int>::reverse_iterator rvi; cout << endl << "Danh sach theo chieu nguoc" << endl; for (rvi=V.rbegin(); rvi!=V.rend(); rvi++) cout << *rvi << endl; return 0; } Chuyn i qua li gia reverse_iterator v iterator: - Hm thnh vin base(): tr v mt iterator tr n phn t hin ti ca reverse_iterator. - To reverse_iterator t iterator: Contructor reverse_iterator(RandomAccessIterator i); V d: vector<int> v; vector<int>::iterator it(v.begin()); vector<int>:: reverse_iterator ri(v.rbegin()); //goi contructor assert(ri.base()==v.end()-1); ri=v.begin(); //goi contructor assert(ri.base()==it); *Lnh assert(); dng kim tra mt biu thc iu kin.

3. Sequential container
3.1. VECTOR

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 25
3.1.1.

Gii thiu :
Lp mng ng vector<T> c sn trong th vin chun STL ca C++ nh ngha mt mng ng cc phn t kiu T, vector c cc tnh cht sau: - Khng cn khai bo kch thc ca mng, vector c th t ng cp pht b nh, bn s khng phi quan tm n qun l kch thc ca n. - Vector cn c th cho bn bit s lng cc phn t m bn ang lu trong n. - Vector c cc phng thc ca stack, c ti u ha vi cc php ton pha ui (rear operations) - H tr tt c cc thao tc c bn nh chn ,xa, sao chp ..

3.1.2.

C php c th dng vector th bn phi thm 1 header #include <vector> v phi c using std::vector; C php ca vector cng rt n gin, v d : vector<int> v ; vector<int> v(10); vector<int> v(10, 2); Khai bo vector v c kiu int. Ch kiu ca vector c trong 2 du ngoc nhn. Dng 1 khi to 1 vector c kch thc ban u l 0, v kch thc ca vector c th nng ln, cho nn khng cn khai bo cho n c bao nhiu phn t cng c. Hoc nu mun th bn cng c th khai bo nh dng 2, nhng cng nhn mnh li rng mc d size = 10, nhng khi bn thm vo hoc xo bt i th kch thc ny cng vn thay i c. Trong dng 3 th 10 phn t ca vector A s c khi to bng 2. ng thi ta cng c th khi to cho 1 vector s l bn sao ca 1 hoc 1 phn vector khc, v d : vector<int> A(10,2); vector<int> B(A); vector<int> C(A.begin(), A.begin() + 5 );//ban sao 5 phan tu dau tien Hy theo di v d sau: #include <iostream> #include <vector> using namespace std; int main() { vector<int> V(3); V[0] = 5; V[1] = 6; V[2] = 7; for (int i=0; i<V.size(); i++) cout << V[i] << endl; return 0; }

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 26
V d trn cho bn thy vic s dng vector rt n gin, hon ton ging vi mng nhng b nh c qun l t ng, bn khng phi quan tm n gii phng cc vng b nh xin cp pht. Trng hp xc nh kch thc mng khi chng trnh ang chy, chng ta dng hm dng mc nh khai bo mng cha xc nh kch thc, sau dng phng thc resize( size _t n ) xc nh kch thc ca mng khi cn.

3.1.3.

Cc phng thc Cc phng thc ca stack: push_back() v pop_back()

3.1.3.1.

#include <iostream> #include <vector> using namespace std; int main() { int i; vector<int> V; for (i=0; i<5; i++) // Lp 5 ln, mi ln a thm 1 s vo vector V.push_back(i); // Nh vy, vector c th c s dng nh stack cout << endl << "Mang ban dau:" << endl; for (i=0; i<V.size(); i++) // Ghi li ni dung ca mng ra mn h.nh cout << V[i] << endl; V.pop_back( ); // Xa phn t va chn vo i cout << endl << "Xoa phan tu cuoi:" << endl; for (i=0; i<V.size(); i++) // In ni dung ca vector sau khi xa cout << V[i] << endl; return 0; }

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 27

Vi v d trn, bn c th thy ta c th s dng vector nh 1 stack: - Khng nn dng ton t [] truy xut cc phn t m n khng tn ti, ngha l v d vector size = 10, m bn truy xut 11 l sai. thm vo 1 gi tr cho vector m n khng c size trc hoc full th ta dng hm thnh vin push_back(), hm ny s thm 1 phn t vo cui vector. - Tng t vi thao tc xa mt phn t cui ra khi vector, bn cng ch cn s dng 1 lnh: pop_back( ) Lp tr.nh C++ Nguyn Ph Qu 3.1.3.2. V d: #include <iostream> #include <vector> using namespace std; template <class T> void print(const vector<T>&v) { for (int i=0; i < v.size(); i++) cout << v[i] << endl; } int main() { char *chao[] = {"Xin", "chao", "tat", "ca", "cac", "ban"}; int n = sizeof(chao)/sizeof(*chao); vector<char*> v(chao, chao + n); //y l 1 cch khi to vector cout << "vector truoc khi xoa" << endl; print(v); v.erase(v.begin()+ 2, v.begin()+ 5); //xa t phn t th 2 n phn t th 5 v.erase( v.begin()+1 ); //xa phn t th 1 cout << "vector sau khi xoa" << endl; print(v); v.clear();//Xa ton b cc phn t cout << "Vector sau khi clear co " << v.size() << " phan tu" << endl; return 0; } 3.1.3.3. Phng thc chn Xa ti v tr bt k, xa trng

iterator insert ( iterator position, const T& x ); void insert ( iterator position, size_type n, const T& x ); void insert ( iterator position, InputIterator first, InputIterator last ); V d: // inserting into a vector #include <iostream> #include <vector>

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 28
using namespace std; int main () { vector<int> v1(4,100); v1.insert ( v1.begin()+3 , 200 ); //chn 200 vo trc v tr th 3 v1.insert ( v1.begin()+2 ,2,300); //chn 2 ln 300 vo trc v tr th 2 vector<int> v2(2,400); int a [] = { 501, 502, 503 }; v1.insert (v1.begin()+2, a, a+3); //chn mng a (3 phn t) vo trc v tr th 2 v1.insert (v1.begin()+4,v2.begin(),v2.end());//chn v2 vo trc v tr th 4 cout << "v1 contains:"; for (int i=0; i < v1.size(); i++) cout << " " << v1[i]; return 0; }

Output: v1 contains: 100 100 501 502 400 400 503 100 200 300 300 100

3.1.3.4.

Mt s hm khc v chc nng

Nhng ton t so snh c nh ngha cho vector: ==, <, <=, !=, >, >= Tham chiu back(), front() template<class _TYPE, class _A> reference vector::front( ); template<class _TYPE, class _A> reference vector::back( );

Tr v tham chiu n phn t u v cui vector: v.front() v[0] v v.back() v[v.size()-1] #include <iostream> #include <vector> using namespace std;

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 29
int main () { int a[] = {3,2,3,1,2,3,5,7}; int n = sizeof(a)/sizeof(*a); vector<int> v(a, a+n); cout << "phan tu dau la " << v.front() << endl; cout << "phan tu cuoi la " << v.back() << endl; cout << "gan phan tu cuoi la 9 ..." << endl; v.back() = 9; cout << "gan phan tu dau la 100 ..." << endl; v.front() = 100; cout << "kiem tra lai vector: "; for (int i=0; i < v.size(); i++) cout << v[i] << ; cout << endl; return 0; }

Output: phan tu dau la 3 phan tu cuoi la 7 gan phan tu cuoi la 9 ... gan phan tu dau la 100 ... kiem tra lai vector: 100 2 3 1 2 3 5 9 Press any key to continue

Hm thnh vin empty()

xc nh vector c rng hay khng ta dng hm thnh vin empty(), hm ny tr v true nu vector rng, v false ngc li. C php : if(v.empty() == true) { cout << "No values in vector \n"; } - capacity() : Tr v s lng phn t ti a m vector c cp pht, y l 1 con s c th thay i do vic cp pht b nh t ng hay bng cc hm nh reserve() v resize() S khc bit gia 2 hm size() v capacity() :

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 30
#include<vector> #include<iostream> int main(int argc , char **argc) { vector<int >so1,so2[10]; so1.reserve(10); cout <<"Kich thuoc toi da:"<<so1.capacity(); cout <<"\n Kich thuoc hien tai cua mang 2 "<<so2.size()<<endl; return 0 ; } - reserve(): cp pht vng nh cho vector, ging nh realloc() ca C v khng ging vector::resize(), tc dng ca reserve hn ch vector t cp pht vng nh khng cn thit.V d khi bn thm 1 phn t m vt qu capacity th vector s cp pht thm, vic ny lp i lp li s lm gim performance trong khi c nhng trng hp ta c th c lng c cn s dng bao nhiu b nh. V d nu ko c reserve() th capacity s l 4 : #include <iostream> #include <vector> using namespace std; int main() { vector< int > my_vect; my_vect.reserve( 8 ); my_vect.push_back( 1 ); my_vect.push_back( 2 ); my_vect.push_back( 3 ); cout << my_vect.capacity() << "\n"; return 0; } - swap(); hon i 2 container vi nhau (ging vic hon i gi tr ca 2 bin ). V d : v1.swap(v2);

3.1.4.

Kim tra trn ch s mng

C mt vn cha c cp n t khi ta lm quen vi vector, l kh nng kim tra trn ch s mng (range check), bit v kh nng ny, chng ta li tip tc vi mt v d mi: #include <iostream> #include <vector> #include <conio.h> using namespace std; int main() { try { // s dng try...catch by li

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 31
vector<long> V(3, 10); // Khi to vector gm 3 thnh phn // Tt c gn gi tr 10 cout << "V[0]=" << V[0] << endl; // a thnh phn 0 ra mn hnh cout << "V[1]=" << V[1] << endl; // a thnh phn 1 ra mn hnh cout << "V[2]=" << V[2] << endl; // a thnh phn 2 ra mn hnh cout << "V[3]=" << V[3] << endl; // Thnh phn 3 (lnh ny hot ng khng // ng v V ch c 3 thnh phn 0,1,2 cout << "V[4]=" << V[4] << endl; // Thnh phn 4 (cng khng ng) // Nhng 2 lnh trn u khng gy li cout << "V[0]=" << V.at(0) << endl; // Khng s dng [], dng phng thc at cout << "V[1]=" << V.at(1) << endl; // Thnh phn 1, OK cout << "V[2]=" << V.at(2) << endl; // Thnh phn 2, OK cout << "V[3]=" << V.at(3) << endl; // Thnh phn 3: Li, chng trnh dng cout << "V[4]=" << V.at(4) << endl; getchar(); } catch (exception &e) { cout << "Tran chi so ! " << endl; } return 0; } Trong v d ny, chng ta li c thm mt s kinh nghim sau: - Nu s dng c php bin_vector[ch_s], chng trnh s khng to ra li khi s dng ch s mng nm ngoi vng hp l (ging nh mng thng). Trong v d, chng ta mi ch ly gi tr phn t vi ch s khng hp l, trng hp ny ch cho kt qu sai. Nhng nu chng ta gn gi tr cho phn t khng hp l ny, hu qu s nghim trng hn nhiu v thao tc s lm hng cc gi tr khc trn b nh. - Phng thc at(ch_s) c tc dng tng t nh dng k hiu [], nhng c mt s khc bit l thao tc ny c kim tra ch s hp l. Minh chng cho nhn xt ny trong v d khi chng trnh chy n v tr lnh V.at(3), lnh ny khng cho ra kt qu m to thnh thng bo li. 3.1.5 Mng 2 chiu vi Vector

#include <iostream> #include <vector> using namespace std; int main() { vector< vector<int> > matrix(3, vector<int>(2,0)); //chu y viet > > de khong nham voi toan tu >> for(int x = 0; x < 3; x++) for(int y = 0; y < 2; y++) matrix[x][y] = x*y; for(int x = 0; x < 3; x++)

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 32
for(int y = 0; y < 2; y++) cout << matrix[x][y]; cout << '\n'; return 0; }

V d ny minh ha vic s dng mng 2 chiu, thc cht y l mt vector ca vector. Mng 2 chiu s dng bin php ny c th c kch thc khc nhau gia cc dng (v d mng 2 chiu l na trn ca ma trn) Bng: cc hm thnh vin lp vector

Hm thnh phn template<class lnlter> void assign(lnlter start, lnlter end); Template<class Size, class T) Void assign(Size num, const T &val = T()); Reference at(size_type l); Const_reference at(size_type l) const; Reference back(size_type l); Const_reference at(size_type l) const; Iterator begin(); Const _iterator begin() const; Size_type capacity() const;

M t Gn gi tr cho vector theo trnh t t start n end. Gn gi tr ca val cho num phn t ca vector. Tr v mt tham chiu n mt phn t c ch nh bi i. Tr v mt tham chiu n phn t cui cng ca vector. Tr v mt bin lp ch nh phn t u tin ca vector. Tr v dung lng hin thi ca vector. y l s lng cc phn t m n c th cha trc khi n cn cp pht thm vng nh. Xa tt c cc phn t trong vector. Tr v true nu vector rng v tr v false nu ngc li. Tr v mt bin lp kt thc mt vector.

Void clear(); Bool empty() const;

Iterator end(); Const_iterator end() const iterator erase(iterator i);

Xa mt phn t c ch bi i. Tr v mt bin lp ch n phn t sau phn t c xa. Xa nhng phn t trong dy t start n end.

Iterator erase(iterator start, iterator end);

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 33
Tr v mt bin lp ch n phn t sau cng ca vector. Reference front(); Const_reference front() const; Allocator_type get_allocator() const; Iterator insert(iterator I, const T&val=T()); Tr v vng nh c cp pht cho vector. Chn val trc tip vo trc thnh phn c ch nh bi i. bin lp ch n phn t c tr v. Chn num val mt cch trc tip trc phn t c ch nh bi i. Chn chui xc nh t start n end trc tip trc mt phn t c ch nh bi i. Tr v s lng phn t ln nht m vector c th cha. Tr v mt tham chiu n phn t c ch nh bi i. Tr v mt tham chiu n phn t u tin ca vector.

Void insert(iterator I, size_type num, const T& val); Template<class lnlter> Void insert(iterator I, lnlter start, lnltr end); Size_type max_size() const;

Reference operator[](size_type i) const; Const_reference operator[](size_type i) const;

Void pop_back(); Void push_back(cons T&val);

Xa phn t cui cng trong vector. Thm vo mt phn t c gi tr val vo cui ca vector. Tr v bin lp nghch ch im kt thc ca vector.

Reverse_iterator rbegin(); Const_reverse_iterator rbegin() const;

Reverse_iterator rend(); Const_reverse_iterator rend() const; Void reverse (size_type num);

Tr v mt bin lp nghch ch im bt u ca vector. Thit lp kch thc ca vector nhiu nht l bng num. Chuyn i kch thc ca vector c xc nh bi num. Nu nh kch thc ca vector tng ln th cc phn t c gi tr val s c thm vo cui vector. Tr v s lng cc phn t hin thi ca trong vector. Chuyn i nhng phn t c lu trong

Void resize (size_type num, T val =T());

Size_type size() const;

Vois swap(vector<T, Allocator>&ob)

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 34
vector hin thi vi nhng phn t trong ob.

3.2. LIST List trong STL l danh sch lin kt i. Khng ging nh vector, h tr truy xut mt cch ngu nhin ( random access ), mt danh sch ch c th c truy xut mt cch tun t. Ngha l nu bn mun truy xut mt phn t bt k trong list th bn phi bt u duyt t phn t u tin hoc phn t cui cng ca list ri duyt ln lt qua cc iterator n phn t .

s dng list, bn phi khai bo file header list: #include <list> List c th khi to bng constructor mc nh hoc sao chp t mng, t list khc hay container khc int a[10]; list<int> list0; list<int> list1(a+2,a+7); list<int> list2(list1.begin()++,--list1.end()); Cc hm thng dng ca list

Phng thc size() empty () max_size() front() back() begin() end() sort()

M t S lng phn t ca list Tr v 1 nu danh sch l trng, 0 nu ngc li Tr v s lng phn t ti a ca list Tr v phn t u tin ca list Tr v phn t cui cng ca list Tr v phn t lp u tin ca danh sch Tr v phn t lp cui cng ca danh sch Sp xp danh sch vi ton t <

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 35
push_front() push_end() pop_front() pop_end() a mt phn t vo u list a mt phn t vo cui list g phn t u list ra g phn t cui list ra

Vi d di chng ta to mt list, a phn t vo v truy xut phn t list<string> list1; list1.push_back("Zebra");list1.push_back("Penguin");list1.push_front("Lion"); list<string>::iterator i; for(i=list1.begin();i!=list1.end();++i) cout<<*i<<endl; Nu chng ta mun mt list cha nhiu list, ta ch cn khai bo list<list<string> > listOfList; Cc hm thng dng khc ca list: list1.insert(list1.begin(),"Seadog");//chn phn t "Seagon" vo v tr u list list1.insert(++list1.begin(),2,"Seadog");//chn phn t "Seagon" vo mt v tr c th list1.erase(list1.begin());//xa mt phn t mt v tr c th list1.erase(++list1.begin(),3);//xa 3 phn t bt u t mt v tr c th list1.clear();//xa tt c cc phn t list1.remove("Zebra");//tm kim v xa phn t "Zebra" list1.reverse();//sp xp gim dn (descending) list1.resize(int);//thit lp s phn t mi ca list iterator i=list1.find(++list1.begin(),--list1.end(),"Penguin"); //tm kim phn t "Penguin", bt u mt v tr c th kt thc mt v tr c th khc // tr v iterator tr n phn t ny. Nu khng tm thy, hm ny tr v v tr kt thc, y l -list1.end() Cc hm vi hai list list1.splice(--list1.end(),list2,list2.begin()); //splice(cut v paste) mt phn t t v tr list2.begin() ca list2 n v tr --list1.end() ca list1 list1.splice(--list1.end(),list2); //splice(cut v paste) tt c phn t ca list2 n v tr --list1.end() ca list1 list1.merge(list2); // Trn danh sch list1 vi danh sch list2 vi iu kin c 2 danh sch u sp xp vi ton t < //Danh sch c trn cng s c sp xp vi ton t <. // phc tp l tuyn tnh) list2.swap(list1);//swap 2 list, ngha l temp = list2; list2 = list1; list1 = temp; Bng: cc hm thnh vin lp list Template<class lnlter> Gn gi tr cho danh sch theo trnh t t bt u n kt thc.

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 36
Void assign(lnlter start, lnlter end); Template<class Size, class T> Void assign (Size num, const T&val=T()); Reference back(); Tr v mt tham chiu n phn t cui cng trong danh sch. (Ch n phn t cui cng ca danh sch.) Tr v mt bin lp ch n phn t u tin ca danh sch. (Ch n phn t u tin danh sch.) Xa tt c cc phn t trong danh sch. Tr v true nu danh sch rng, v false nu ngc li. Tr n cui danh sch. Gn num phn t ca danh sch bng gi tr value.

Const_reference back()const; Iterator begin(); Void clear(); Bool empty()const; Iterator end(); Const_iterator end() const; Iterator erase(iterator i);

Xa phn t c ch nh bi i. Ch n phn t k sau phn t c xa. Xa nhng phn t t v tr start n end. Ch n phn t k sau phn t cui cng c xa. Tr v mt tham chiu ch n phn t u tin ca danh sch. Tr v vng nh c cp pht cho danh sch. Chn gi tr val mt cch trc tip vo trc phn t c ch nh bi i. Tr v mt bin lp ch n phn t ny. Chn num gi tr val trc tip trc phn t c ch nh bi i. Chn theo trnh t c xc nh t start n end trc tip trc phn t c ch nh bi i.

Iterator erase(iterator start, iterator end);

Reference front(); Const_referencefront() const; Allocator_type get_allocator() const; Iterator insert(iterator i, const T &val=T());

Void insert(iterator I, size_type num, const T&val=T()); Template<class lnlter> Void insert(iteratir i, lnlter start, lnlter end); Size_type max_size max_size() const; Void merge(list<T. allocator>&ob); Template<class Comp> Void merge(<list<T, Allocator>&ob, Comp cmpfn); Void pop_back();

Tr v s lng cc phn t m danh sch c th gi. Trn danh sch c th t c cha trong ob vi mt danh sch c th t ang gi thc hin phng thc. Kt qu l mt danh sch c th t. Sau khi trn, danh sch cha trong ob l rng. dng th 2, mt hm so snh c nh ngha xc nh gi tr ca mt phn t th nh hn gi tr mt phn t khc. Xa phn t cui cng trong danh sch.

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 37
Void pop_front(); Void push_back(const T&val); Xa phn t u tin trong danh sch. Thm mt phn t c gi tr c xc nh bi val vo cui danh sch. Thm mt phn t c gi tr c xc nh bi val vo u danh sch. Tr v mt bin lp ngc ch n cui danh sch.

Void push_front(const T&val);

Reverse_iterator rbegin(); Const_reverse_iterator rbegin() const; Void remove(const T&val); Template <class UnPred> Void remove_if(UnPred pr); Reverse_iterator rend(); Const_reverse_iterator rend() const; Void resize(isze_type num, T val=T());

Xa nhng phn t c gi tr val trong danh sch. Xa nhng m phn t nu nh pr l true.

Tr v mt bin lp ngc ch n u danh sch.

Thay i kch thc ca danh sch c xc nh bi num. Nu nh danh sch di ra thm, th nhng phn t c gi tr val c thm vo cui. o ngc danh sch ang gi thc hin phng thc. Tr v s lng cc phn t hin ti trong mng. Sp xp danh sch. Dng th 2 s dng hm so snh cmpfn xc nh gi tr ca phn t ny c nh hn gi tr ca phn t kia khng.

Void reverse(); Size_type size() const; Void sort (); Template <class Comp> Void sort(conm cmpfn); Void spilice(iterator i, list <T, allocator> &ob);

Chn ni dung ca ob vo trong danh sch ang gi thc hin phng thc ti v tr c ch nh bi i. Sau thao tc ny ob l rng. Xa phn t c ch nh bi el trong danh sch ob v lu tr n vo trong danh sch ang gi thc hin phng thc ti v tr c ch nh bi i. Xa mt mng phn t bt u t v tr start n v tr end v lu n vo trong danh sch ang gi thc hin phng thc bt u t v tr i. Hon v ni dung nhng phn t c lu tr trong danh sch ang gi thc hin phng thc vi nhng phn t trong ob. Xa nhng phn t trng trong danh sch ang gi thc hin phng thc. Dng 2 s dng pr nh ngha s duy nht.

Void splice(iterator i, list <allocator> &ob, iterator el);

Void splice(iterator I, list<T, Allocator>&ob, iterator start, iterator end).

Void swap(list<T, Allocator> &ob);

Void unique(); Template<class BinPred>

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 38
Void unique(BinPred pr);

3.3. DEQUE #include <deque> deque ging list ngoi tr: -cho php random access, vi operator[], ngha l d[5], d[6], etc nh mng -c ti u ha vi cc php ton pha u (front operations ) -khng c sn cc hm splice,sort, merge, reserve. V d: deque<int> d; d.push_front(5); cout<<d[0]; 3.4. STRING 3.4.1. Gii thiu :

Cc chng trnh C++ c th s dng chui theo cch thc c ca Ngn ng C: mng cc k t kt thc bi k t m ASCII l 0 (k t null ) cng vi cc hm th vin khai bo trong <string.h> . Nhng bt tin khi dng theo cch ny ch yu n t vic qun b nh ng v k t null, truyn v tr li gi tr cho hm. Th vin chun cung cp kiu string (xu k t) , gip cc bn trnh khi hon ton cc phin phc nu trn. String thc cht l mt vector<char> c b sung thm mt s phng thc v thuc tnh, do , n c ton b cc tnh cht ca 1 vector, vd hm size(), push_back(), ton t [] Cc ch th #include cn khai bo s dng string : #include <string> using std::string; //using namespace std; 3.4.2. S dng : Cc php ton v phng thc c bn:

3.4.2.1.

Cc ton t +, += dng ghp hai chui v cng ghp mt k t vo chui; Cc php so snh theo th t t in: == (bng nhau), != (khc nhau), > (ln hn), >= (ln hn hay bng), < (nh hn), <= (nh hn hay bng); Phng thc length( ) v php ly ch s [ ] duyt tng k t ca chui: nu s l bin kiu string th s[i] l k t th i ca s vi 0 i <s.length( ); Php gn (=) dng gn bin kiu string bng mt chui, hoc bng string khc, chng hn: string s=ABCDEF; hay s1=s2; m khng cn copy xu. Nhng constructor thng s dng nht: string(); string(const char *str); string(const string & str);

C th dng ton t << vi cout xut mt chui ra mn hnh hoc dng ton t >> vi cin nhp mt chui k t n khi gp mt khong trng th dng.

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 39
char st[]=ABCDEF; string s; s=XYZ; cout << s << endl; s=st; cout << s.length() << : << s << endl; // Nhp mt string: istream& getline ( istream& in, string& str, char delimiter = \n); c 1 dng v n bn t i tng nhp (istream) in (c th l file hay i tng chun cin) tng k t n khi k t delimiter c nhp vo ( mc nh l \n ) (thng c dng thay cho cin >> khi nhp chui c k t space).C th dng kt hp vi ton t >> // getline with strings #include <iostream> #include <string> using namespace std; int main () { string str; short age; cout << "Please enter full name and age"<< endl; getline( cin, str) >> age; cout << "Thank you " << str << "!\n"; return 0; } 3.4.2.2. Cc phng thc chn, xa, ly chui con

Phng thc substr(int pos, int nchar) trch ra chui con ca mt chui cho trc, v d str.substr(2,4) tr v chui con gm 4 k t ca chui str k t k t v tr th 2 (k t u tin ca chui v tr 0). //get substring #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string s="ConCho chay qua rao"; cout << s.substr(2,4) << endl; // cout << new string(str.begin()+2, str.begin()+2+4);

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 40
getchar(); return 0; } Phng thc insert( ) chn thm k t hay chui vo mt v tr no ca chui str cho trc. C nhiu cch dng phng thc ny:

str.insert(int pos, char* s; ca str; str.insert(int pos, string s); str.insert(int pos, int n, int ch);

chn s (mng k t kt thc \0) vo v tr pos

chn chui s (kiu string) vo v tr pos ca chui str; chn n ln k t ch vo v tr pos ca chui str;

// inserting into a string #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string str="day la .. xau thu"; string istr = "them"; str.insert(8, istr); cout << str << endl; getchar(); return 0; } Phng thc str.erase(int pos, int n) xa n k t ca chui str k t v tr pos; nu khng quy nh gi tr n th tt c cc k t ca str t v tr pos tr i s b xa

// erase from a string #include <iostream> #include <string> #include <conio.h>

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 41
using namespace std; int main () { string str="day cung la xau thu"; str.erase(0, 3); // " cung la xau thu" cout << str << endl; str.erase(6, 2); cout << str << endl; // " cung xau thu" getchar(); return 0; } 3.4.2.3. So snh ( compare ) Bn c th n gin l s dng nhng ton t quan h ( ==, !=, <, <=, >= ) c nh ngha sn. Tuy nhin, nu mun so snh mt phn ca mt chui th s cn s dng phng thc compare(): int compare ( const string& str ) const; int compare ( const char* s ) const; int compare ( size_t pos1, size_t n1, const string& str ) const; int compare ( size_t pos1, size_t n1, const char* s) const; int compare ( size_t pos1, size_t n1, const string& str, size_t pos2, size_t n2 ) const; int compare ( size_t pos1, size_t n1, const char* s, size_t n2) const; Hm tr v 0 khi hai chui bng nhau v ln hn hoc nh hn 0 cho trng hp khc V d: // comparing apples with apples #include <iostream> #include <string> using namespace std; int main () { string str1 ("green apple"); string str2 ("red apple"); if (str1.compare(str2) != 0) cout << str1 << " is not " << str2 << "\n"; if (str1.compare(6,5,"apple") == 0) cout << "still, " << str1 << " is an apple\n"; if (str2.compare(str2.size()-5,5,"apple") == 0) cout << "and " << str2 << " is also an apple\n"; if (str1.compare(6,5,str2,4,5) == 0)

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 42
cout << "therefore, both are apples\n";

return 0; } 3.4.2.4. Cc phng thc tm kim v thay th

Phng thc find( ) tm kim xem mt k t hay mt chui no c xut hin trong mt chui str cho trc hay khng. C nhiu cch dng phng thc ny:

str.find(int ch, int pos = 0); str.find(char *s, int pos = 0); str.find(string& s, int pos = 0);

tm k t ch k t v tr pos n cui chui str tm s (mng k t kt thc \0) k t v tr pos n cui tm chui s k t v tr pos n cui chui.

Nu khng quy nh gi tr pos th hiu mc nhin l 0; nu tm c th phng thc tr v v tr xut hin u tin, ngc li tr v gi tr -1. //find substring #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string str="ConCho chay qua rao"; cout << str.find("chay") << endl; // 7 cout << (int)str.find("Chay") << endl; // -1 getchar(); return 0; } Hm tm kim ngc (rfind) //find from back #include <iostream> #include <string> #include <conio.h>

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 43
using namespace std; int main () { string str="ConCho chay qua chay qua rao"; cout << str.find("chay") << endl; // 7 cout << (int)str.rfind("chay") << endl; // 16 getchar(); return 0; }

Phng thc replace( ) thay th mt on con trong chui str cho trc (on con k t mt v tr pos v m ti nchar k t k t v pha cui chui) bi mt chui s no , hoc bi n k t ch no . C nhiu cch dng, th t tham s nh sau:

str.replace(int pos, int nchar, char *s); str.replace(int pos, int nchar, string s); str.replace(int pos, int nchar, int n, int ch);

// replace from a string #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string str="con cho la con cho con. Con meo ko phai la con cho"; str.replace(4, 3, "CHO"); // "con CHO la con cho con. Con meo ko phai la con cho"; cout << str << endl; getchar(); return 0; }

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 44
3.4.2.5. Chuyn v dng C-string

Hm thnh vin c_str() s gip bn chuyn t string thnh dng C-string: const charT* c_str ( ) const; Hm ny cng t ng sinh ra k t null chn vo cui xu. T prototype ta cng thy c hm tr v mt hng chui, iu ny ng ngha vi vic ta khng th thay i chui tr v. Gi phng thc c_str(); string s = "some_string"; cout << s.c_str() << endl; cout << strlen(s.c_str()) << endl;

Sau y l v d dng c_str() v cc hm trong <string.h> // strings vs c-strings #include <iostream> #include <string.h> #include <string> using std::string; int main () { char * cstr, *p; string str ("Xin chao tat ca cac ban"); cstr = new char [str.size()+1]; strcpy (cstr, str.c_str()); // cstr l 1 bn sao c-string ca str p=strtok (cstr," "); while (p!=NULL) { cout << p << endl; p=strtok(NULL," "); } delete[] cstr; return 0; }

Output: Xin chao tat ca cac

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 45
ban

3.4.2.6. Mt s phng thc khc Cn nhiu phng thc tin ch khc nh: append(), rfind(), find_first_not_of(), find_last_not_of(), swap(). Cch dng cc hm ny u c trnh by trong h thng hng dn (help) ca cc mi trng c h tr STL (trong VC++ l MSDN). Ngoi ra cc phng thc nh find_first_of() tng t nh find(), find_last_of() tng t nh rfind(). 3.5. BITSET bitset c cu trc ging nh mt mng, nhng mi phn t ch chim mt bit (nn nh kiu d liu char mi phn t chim 8 bit) V d sau ta khi to mt bitset 7 phn t vi 5 phn t u l 1,1,0,1,0 #include<bitset> bitset<7> b(string("01011")); for(int i=0;i<7;i++) cout<<b[i]<<endl; 3.6. VALARRAY valarray ging nh l mt mng lu tr cc phn t. N ng ch v n c th lm vic c vi cc hm ton hc thng dng trong th vin <math>, <functional>, cc ton t c bn v cng nh nhiu hm t nh ngha.Valaray cho php tnh ton hang lot trn 1 bng s. #include<valarray> #include<cmath> int i=0; int a1[]= {3,2,6,4,5}; valarray<int> v1(a1,5); v1 <<= 3;//php ton << (dch tri bit) for(i=0;i<4;i++) cout<<v1[i]<<endl; double a2[] = {2.4,6.8,0.2}; valarray<double> v2(a2,3); v2 = sin(v2);//hm sin for(i=0;i<3;i++) cout<<v2[i]<<endl;

4. Associative Container
Associative bao gm map (nh x) multimap (a nh x) set (tp hp) multiset (a tp hp) S khc nhau gia cc associative container v sequential container : -cc sequential container lu tr cc phn t (gi l cc value) v cc value ny c truy xut tun t theo v tr ca chng trong b lu tr -cc associative container lu tr cc phn t (gi l cc value) v cc kha (gi l cc key) lin kt vi cc value v cc value ny c truy xut theo cc key m chng c lin kt 4.1. Map & multimap Kiu map cho php bn ly tng ng gia mt gi tr vi mt gi tr khc, hai gi tr ny to thnh mt cp gi tr. Trong gi tr u ca cp l kha (key), key l duy nht (khng c 2 key cng xut hin trong 1 map). Do , t key bn c th tm c gi tr tng ng vi key trong cp.

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 46

Nu thc hin tm kim bnh thng trn mt mng N phn t, bn phi mt trung bnh N/2 php tm kim. D liu ca cc key c t chc di dng cy heap (l tri nh hn gc, l phi ln hn gc) nn vic tm kim cc cp theo kha rt nhanh, thi gian trung bnh l log2N (v su ca cy l log2N). #include<map> map<char*,int> mapInt; //nh x t mt char* n mt int mapInt["one"] = 1; cout<<mapInt["one"];

Nh bn thy, trong map ta truy xut 1 phn t vi operator[] thng qua kha ( key) thay v ch s (index) nh x trong map i t mt key n mt value. V d sau key l lp string, value l lp Person class Person { public:string name; Person(string name):name(name){} friend ostream& operator<<(ostream& os,const Person& p) { os<<p.name; return os; } }; typedef map<string,Person> MP; void display(const MP& mp) { for(const_iterator i=mp.begin();i!=mp.end();++i) cout<<(*i).first<<" "<<(*i).second<<endl; } int main() { MP mapPerson;Person p("Viet"); mapPerson.insert( value_type("one",p) ); display(mapPerson); return 0; }

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 47

Gii thch: value_type thc cht l lp pair ca th vin utility: pair<string,Person>, hm dng ca n dng khi to mt cp (key,value) cho mt nh x. Cn mt cch khc l dng hm make_pair pair<string,Person> pr = make_pair(string("two"),Person("Nam")); mapPerson.insert(pr);

Comparator Mt functor dng lm tiu ch so snh, sp xp, etc cc phn t trong mt map gi l mt comparator. Comparator s nh ngha th no l ln hn, nh hn, bng nhau theo cch ca chng ta, hoc theo mt s cch nh ngha sn: less, greater Khi map thay v c 2 argument nh map<key K,value V> th c 3 argument l map<key K,value V,comparator C> Dng comparator so snh class comparePerson { public: bool operator()(Person p1,Person p2) { return p1.name.compare(p2.name); } }; typedef map<Person,int, comparePerson> MAP; MAP pMap; Person p=new Person(...); MAP::iterator i=pMap.find(d); if(i==pMap.end()) pMap.insert(MAP::value_type(d,1)); Dng comparator sp xp class comparePerson { public: bool operator()(const Person& p1,const Person& p2) { return p1.name.compare(p2.name); } }; typedef map<string,Person,comparePerson> MP; MP mapPerson;Person p("Viet"); mapPerson.insert(pair<string,Person>("one",Person("Nam"))); mapPerson.insert(pair<string,Person>("two",Person("Viet"))); mapPerson.insert(pair<string,Person>("three",Person("An"))); display(mapPerson); Bn lu l tt c cc asociative container u c xy dng sn comparator mc nh l less<key> (trong th vin functional) Ngha l khi bn khai bo map<char*,int> mapInt;

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 48

thc ra l map<char*,int,less<char*> > mapInt; V d: typedef map<char*,int> MI; typedef map<char*,int>::iterator MII; MI m;m["c"] = 1;m["b"] = 2;m["a"] = 3; for(MII i=m.begin();i!=m.end();++i) cout<<(*i).first<<" "<<(*i).second<<endl; Chy th bn s thy cc value trong map c sp xp li v tr theo cc key ca chng comparator dng vi cc sequential container class People { public: int age; People( int age ) { (*this).age=age; } }; class AgeSort { public: bool operator()(const People*& a,const People*& b) { return (*a).age>(*b).age; } }; typedef list<const People*> LP; int main() { const People* p1 = new People(5);const People* p2 = new People(7); LP p; p.push_back(p1); p.push_back(p2); p.sort(AgeSort());//using sort with comparator for(LP::const_iterator i=p.begin();i!=p.end();++i) cout<<(**i).age; return 0; } Nu bn bit tn dng, map c th ng dng gii rt nhiu dng bi ton khc nhau. Trong phn ny, chng ti xin gii thiu 2 ng dng ca map: - S dng lm t in: V d: tra cu thng tin ca sinh vin theo m s - m s lng ca mt thnh phn (cho mt lot cc phn t, tm xem c bao nhiu phn t v mi phn t xut hin bao nhiu ln) V d: t in

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 49
#include <iostream> #include <map> using namespace std; class sv { public: int maso; string ten; string lop; void print() { cout << "****************************************" << endl << "Ma so: " << maso << endl << "Ho ten: " << ten << endl << "Lop: " << lop << endl; } }; int main () { sv a[] = { {1342, "Mai", "48th"}, {43212, "Lan", "47th"}, {33133, "Cuc", "47th"}, {43321, "Truc", "45th"}, {1234, "Dao", "42th"} }; int n = sizeof(a)/sizeof(a[0]); map<int, sv> m; for (int i=0; i<n; i++) m[a[i].maso] = a[i]; m[43212].print(); m[1234].print(); return 0; }

V d: m #include <iostream> #include <stdlib.h> #include <map> using namespace std; int main() { string a[] = {"chuoi", "na", "oi", "tao", "chuoi", "oi", "na", "tao", "oi"}; int n = sizeof(a)/sizeof(a[0]); map<string, int> m; for (int i=0; i<n; i++) m[a[i]] ++; map<string, int>::iterator j; for (j=m.begin(); j!=m.end(); j++)

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 50
cout << "Xau ky tu '" << j->first << "' xuat hien " << j->second << " lan " << endl; return 0; }

Multimap Vi map th mi key ch nh x n mt v ch mt value. Vi multimap th mi key c th nh x n nhiu hn mt value, ni cch khc l nhiu value trong multimap c chung mt key #include<map> typedef multimap<string,Person> MP; MP multimapPerson; multimapPerson.insert(MPVT("one",Person("Nam"))); multimapPerson.insert(MPVT("one",Person("Viet"))); display(multimapPerson); typedef multimap<Person,int,comparePerson> MAP; Cng chnh v l do nhiu value trong multimap c th c chung mt key nn multi khng c operator[] nh map, tc l bn khng th gi multimapPerson[one] 4.2. Kiu hash_map (nh x dng mng bm) Kiu map cho php nh x gia tp kha v tp gi tr vi thi gian O(logN). Map s dng cu trc d liu kiu cy nn phc tp l log2N. Tuy nhin, bn c th s dng cu trc d liu mnh hn l mng bm (hash_map). Hash_map c th tm kim theo kha vi phc tp O(1). 4.3. Set & mutiset set cng ging map ngoi tr mt iu, key cng chnh l value #include<set> set<int> s; for(int j=0;j<6;j++) s.insert(rand()); for(set<int>::iterator i=s.begin();i!=s.end();++i) cout<<(*i)<<endl; set dng v i comparator (greater ng vai tr comparator): set<int,greater<int> > s; for(int j=0;j<6;j++) s.insert(rand()); for(set<int,greater<int> >::iterator i=s.begin();i!=s.end();++i) cout<<(*i)<<endl; set khng c operator[]

Multiset multiset cng ging set ngoi tr mt iu, mi key c th nh x n nhiu hn mt value, ni cch khc l nhiu value trong multiset c chung mt key Bn c th thc mc iu ny chng c ngha g, v trong set th key cng chnh l value, vng, chnh v th nn mt multiset s c th cha nhng phn t ging nhau: #include<set> set<int> s; s.insert(1);

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 51
s.insert(1); for(set<int>::iterator i=s.begin();i!=s.end();++i) cout<<(*i)<<endl; multiset<int> ms; ms.insert(3); ms.insert(3); for(multiset<int>::iterator mi=ms.begin();mi!=ms.end();++mi) cout<<(*mi)<<endl;

4.4. Kiu hash_set (tp hp) Pascal l mt trong t ngn ng c kiu d liu nguyn thy l tp hp. C v C++ khng c kiu d liu ny. Tuy nhin, bn c th s dng kiu d liu tp hp trong STL. Tp hp trong STL cn mnh hn tp hp trong Pascal rt nhiu v n h tr tt c cc kiu d liu (tp hp trong Pascal ch h tr dng s) vi s lng phn t khng hn ch (tp hp ca Pascal ch c ti a 256 phn t).

IV.FUNTION OBJECT ( FUNCTOR )


1. KHI NIM Mt function object (i tng hm) l mt object (i tng) c s dng nh mt function (hm). Gi function object ngha l chng ta ang gi n operator() ca n. Vit mt function object ngha l vit operator() cho mt lp. Cc function object l cc object, bi vy chng c trng thi, cn cc hm bnh thng th khng, do , chng c th ng x khc nhau ty vo trng thi v iu to nn s linh hot Vy function object l mt instance ca mt lp m lp phi c t nht mt hm tha: quyn truy xut phi l public phi l mt hm thnh vin, khng phi l mt hm friend khng phi l mt hm static c khai bo operator()

2. PHN LOI Generator: Mt loi functor hoc function khng c i s v tr v value_type v d hm rand() trong <stdlib> v mt s thut ton chng hn nh generate_n() - sinh mt chui. Unary: Mt loi functor hoc function dng mt i s duy nht ca value_type v tr v mt gi tr m c th khng phi value_type ( void chng hn). Binary: Mt loi functor hoc function nhn hai i s ca hai kiu bt k v tr v gi tr no . Unary Predicate: Mt unary operation tr li gi tr bool. Binary Predicate: Mt binary operation tr li gi tr bool.

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 52
Ngoi ra, ta cn phn loi da trn tnh cht object ca functor: LessThanComparable: Mt functor c nh ngha t nht mt ton t <. Assignable: Mt functor c nh nghi ton t gn ( = ) EqualityComparable: Mt functor c nh ngha ton t so snh tng ng ==

3. S DNG FUNCTION OBJECT V d ta vit mt hm bnh thng nh sau void iprintf(int i) const { cout<<i<<endl; } By gi ta s vit mt lp nh sau class iprintf { public: void operator()(int i) const { cout<<i<<endl; } }; Instance ca lp ny l mt object c gi l function object, l mt object c s dng nh mt function. S dng nh th no ? iprintf x; x(5); hoc iprintf()(5); Khi ta gi iprintf()(5) ngha l chng ta ang gi n operator() ca lp iprintf Ci t c th cho operator() ty thuc vo ng cnh s dng ca function object. S phc tp ha ny mang li ng dng : 1.Lm tiu ch sp xp cho cc container: nu cc phn t ca set l cc kiu c bn nh int hay string, chng ta c th s dng cc tiu ch sp xp sn c nh greater hay less. V d dng khai bo : std::set< std::string, greater< std::string > > strSet;

Tuy nhin, nu cc phn t cn a vo set c kiu do ngi dng nh ngha, v d l cc i tng ca mt lp, m thm ch lp khng c operator < > th lm sao xc nh th t ca chng trong set? Cch gii quyt l chng ta t nh ngha mt tiu ch sp xp mi, y chnh l lc cn n function object. ( xem trong phn associative container ) 2.Lm tham s cho cc STL algorithm s c ni n ngay sau y.

Vic mt function object c s dng u s quyt nh cch vit operator() ca lp . V d di y l mt lp c nhiu hn mt operator() class iprintf { int i; public:iprintf(int i):i(i){} public: void operator()() const

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 53
{ cout<<i<<endl; } void operator()(int i) const { cout<<"Integer:"<<i<<endl; } void operator()(float f) const { cout<<"Float:"<<f<<endl; } }; int main(int argc,char** argv) { iprintf x(20); x(); x(5); //gi s khng c operator()(int i), cu ny s gi operator()(float f) x(2.3); //gi s khng c operator()(float f), cu ny s gi operator()(int i) vi i = 2 x("something"); //li return 0; } Tng t thay v iprintf(5); x(7); chng ta cng c th gi iprintf (5)(7); C mt iu ch v d trn l nu cng tn ti operator()(int i) v operator()(float f) th cu lnh x(2.3); s bo li ambiguous (nhp nhng) gia hai hm. C mt cch n gin l vit li thnh x((float)2.3); V chuyn ambiguous cn ni thm sau. Predicate Predicate c mt nh ngha phc tp hn. Mt predicate c cp n y l mt function hoc mt functor c iu kin gi tr tr v ng hoc sai hoc mt gi tr c th chuyn kiu thnh ng hoc sai. Trong C/C++, ng c ngha l khc 0 v sai c ngha l bng 0 V d hm sau y l mt predicate double truefalse(double n) { return n; } Mt s hm thng dng trong algorithm Hm find vector<int> v; v.push_back(4);v.push_back(3);v.push_back(2); vector<int>::iterator i = find (v.begin(),v.end(),3); if(i!=v.end()) cout<<*i; Hm find tm t phn t v.begin() n phn t v.end() v tr v iterator tr n phn t c gi tr l 3, nu khng tm thy s tr v v.end() Hm find_if int IsOdd(int n) { return n%2; } int main() { list<int> l; l.push_back(4);l.push_back(5);l.push_back(2); list<int>::iterator i=find_if(l.begin(),l.end(),IsOdd);

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 54
if(i!=l.end()) cout<<*i; } Hm find_if tm t phn t v.begin() n phn t v.end() v tr v iterator tr n phn t c gi tr tha predicate, nu khng tm thy s tr v v.end() Lu , lc ny IsOdd ng vai tr l mt predicate, xc nh xem phn t ca list c l s l hay khng (tc l khi a vo lm tham s ca hm IsOdd c tr v mt s khc 0 hay khng) Chng ta vit li predicate ny bng cch dng functor class IsOdd { public: bool operator()(int n) const { return n%2; } }; int main() { list<int> l; l.push_back(4);l.push_back(5);l.push_back(2); list<int>::iterator i=find_if(l.begin(),l.end(),IsOdd()); if(i!=l.end()) cout<<*i; } Hm equal trn chng ta mi xt cc v d vi predicate c mt i s, ta xt mt hm khc ca algorithm dng predicate nhiu hn mt i s, hm equal class compare { public: bool operator()(int i,int j) const { return i==j; } }; int main() { compare c; int a[] = {1, 2, 3, 4, 5}; list<int> l(a,a+3); //list t phn t hn mng cout<<equal(l.begin(),l.end(),a,c)<<endl; a[2] = 6; cout<<equal(l.begin(),l.end(),a,c)<<endl; return 0; } Hm equal so snh tng phn t ca list t phn t l.begin() n phn t l.end() vi tng phn t tng ng ca mng a sao cho mi cp phn t u tha predicate l c, tr v l true nu tng cp phn t so snh vi nhau u cho gi tr true (khng cn quan tm n s lng phn t c tng ng khng) Nhng ch cn mt cp tr v false th hm s tr v false 4. TH VIN FUNCTIONAL #include <functional> a)Hng ca mt predicate

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 55
C nhiu s mp m do t ng ngha gia cc khi nim ton hc trong c hai ngn ng ting Vit v ting Anh, do nh ngha sau ch mc c gng chnh xc nht c th c: S ton t (operand) ca mt php ton (operator), tng ng l s i s (argument) ca mt hm (function), c gi l hng (arity) ca php ton hay hm Tng t, s ton t (operand) ca mt biu thc (expression), tng ng l s i s (argument) ca mt i tng hm (functor), c gi l hng (arity) ca biu thc hay i tng hm V d: -Unary (n nguyn, n phn, mt ton hng, mt ngi): n! (giai tha ca n) l mt unary operator n! l mt unary expression, ch bao gm mt unary operator int giaithua(int n) l mt unary function mt object ca class giaithua{int operator()(int n)} l mt unary functor -Binary (nh nguyn, nh phn, hai ton hng, hai ngi): a + b l mt binary expression, ch bao gm mt binary operator int addition(int a,int b) l mt binary function mt object ca class addition{int operator()(int a,int b)} l mt binary functor -Ternary (tam nguyn, tam phn, ba ton hng, ba ngi): b * b 4 * a * c l mt ternary expression, bao gm mt unary operator v ba binary operator double delta(double a, double b,double c) l mt ternary function mt object ca class delta{ double operator()(double a, double b,double c)} l mt ternary functor Ngoi ra cn c nhiu t gc Latin khc nh quaternary (bn ton hng) quinary (nm ton hng) nary gi chung l nhiu ton hng. Hng ca predicate tc l hng ca function hay functor m ng vai tr predicate. Nh v d trn, addition l mt binary predicate, delta l mt ternary predicate - Cu trc unary_function trong th vin functional Trong th vin functional nh ngha sn cu trc unary_function: template<class Arg,class Result> struct unary_function { typedef Arg argument_type; typedef Result result_type; }; unary_function l cu trc nh ngha sn cho tt c unary function v unary functor vi Arg l kiu d liu ca i s v Result l kiu tr v ca hm c operator() Chng ta vit li lp IsOdd, nh ngha n l mt unary_function class IsOdd:public unary_function<int,bool> { public: bool operator()(int n) const { return n%2; } }; Cu trc binary_function trong th vin functional Tng t, trong th vin functional nh ngha sn cu trc binary_function template<class Arg1,class Arg2,class Result> struct binary_function

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 56
{ typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; }; binary_function l cu trc nh ngha sn cho tt c binary function v binary functor vi Arg1 l kiu d liu ca i s th nht v Arg2 l kiu d liu ca i s th hai v Result l kiu tr v ca hm c operator() Chng ta vit li lp compare, nh ngha n l mt binary_function class compare:public binary_function<int,int,bool> { public: bool operator()(int i,int j) const { return i==j; } }; Tng t chng ta c th t vit cc cu trc ternary_function, quaternary_function, vn vn nu mun. V d di y l mt cu trc ternary_function t vit v mt lp c nh ngha l mt ternary_function template<class Arg1,class Arg2,class Arg3,class Result> struct ternary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Arg3 third_argument_type; typedef Result result_type; }; class multiply:public ternary_function<int,float,long,double> { public: double operator()(int i,float f,long l) const { return i*f*l; } }; Rng buc (bind) ton hng cho predicate C nhiu hm ch chp nhn mt i s, nhng chng ta li cn chuyn vo cho n cc predicate l binary predicate nh binary function hay binary functor. Trong trng hp chng ta cn rng buc ton hng cho binary predicate n tr thnh mt unary predicate. V d chng ta cn dng hm find_if tm cc phn t trong mt vector tha mt binary predicate, nhng find_if li ch chp nhn unary predicate, khi chng ta cn rng buc ton hng cho binary predicate n tr thnh mt unary predicate binary predicate mun c rng buc ton hng phi c nh ngha l mt binary_function +Hm bind1st Hm bind1st rng buc ton hng th nht ca mt binary predicate vi mt gi tr cho trc n tr thnh mt unary predicate vi i s cn li ca binary predicate ban u tr thnh i s ca unary predicate kt qu class compare:public binary_function<int,int,bool>

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 57
{ public: bool operator()(int i,int j) const { return i+1==j; } }; int main() { vector<int> v; v.push_back(4);v.push_back(0);v.push_back(1); vector<int>::iterator i=find_if(v.begin(),v.end(),bind1st(compare(),0)); if(i!=v.end()) cout<<i-v.begin(); return 0; } Trong v d trn, i s th nht ca compare() c rng buc bng 0, compare() tr thnh mt predicate ch c mt i s l i s cn li ca compare() ban u, v find_if ch vic truyn tham s l iterator tr n cc phn t ca v vo i s ny, qu trnh chy vng lp din ra ging nh sau compare()(0,4) //php so snh 0 + 1 == 4 tr v false compare()(0,0) //php so snh 0 + 1 == 0 tr v false compare()(0,1) //php so snh 0 + 1 == 1 tr v true +Hm bind2nd Hm bind2nd rng buc ton hng th hai ca mt binary predicate vi mt gi tr cho trc n tr thnh mt unary predicate vi i s cn li ca binary predicate ban u tr thnh i s ca unary predicate kt qu class compare:public binary_function<int,int,bool> { public: bool operator()(int i,int j) const { return i+1==j; } }; int main() { vector<int> v; v.push_back(4);v.push_back(0);v.push_back(1); vector<int>::iterator i=find_if(v.begin(),v.end(),bind2nd(compare(),1)); if(i!=v.end()) cout<<i-v.begin(); return 0; } Trong v d trn, i s th hai ca compare() c rng buc bng 1, compare() tr thnh mt predicate ch c mt i s l i s cn li ca compare() ban u, v find_if ch vic truyn tham s l iterator tr n cc phn t ca v vo i s ny, qu trnh chy vng lp din ra ging nh sau compare()(4,1) //php so snh 4 + 1 == 1 tr v false compare()(0,1) //php so snh 0 + 1 == 1 tr v true compare()(1,1) //php so snh 1 + 1 == 1 tr v false (thc ra khng c php so snh ny, hm tr v iterator ri) b)Cc hm ton hc c bn ca th vin functional Bao gm cng (plus) tr (minus) nhn (multiplies) chia (divides) chia ly d (modulus) i du (negate) Cc hm ny rt n gin, v d: negate:

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 58
int a[]={1,-2,3}; transform(a,a+3,a,negate<int>()); for_each(a,a+3,Output<int>()); plus: int a[]={1,2,3,4,5}; int b[]={6,7}; int c[5]; transform(a,a+5,b,c,plus<int>()); vd trn c mt iu ng ch , bn t tm xem modulus: int a[]={1,2,3,4,5}; int b[]={2,2,2,2,2}; int c[5]; transform(a,a+5,b,c,modulus<int>()); Ci v d hm modulus ny hi k k. Modulus l mt binary function, gi s by gi chng ta mun cc phn t ca a lun modulus cho 2 th lm th no ? Phi rng buc ton hng cho modulus n tr thnh mt unary function thi: int a[]={1,2,3,4,5}; int b[5]; transform(a,a+5,b,bind2nd(modulus<int>(),2)); Cc hm so snh bao gm equal_to (==) not_equal_to (!=) greater (>) less (<) greater_equal (>=) less_equal(<=) logical_and (&&) logical_or (||) logical_not (!) Cc hm ny cch dng y nh nhau, ly mt v d hm greater: int a[]={3,2,5,1,4}; sort(a,a+5,greater<int>()); for_each(a,a+5,Output<int>()); Gi s ta mun dng hm count_if vi hm greater, tr v s phn t nh hn 3 chng hn. Ta lm th no ? greater l mt binary function, li phi rng buc ton hng cho n vi i s th nht l 3 ri int a[]={3,2,5,1,4}; cout<<(int)count_if(a,a+5,bind1st(greater<int>(),3)); for_each(a,a+5,Output<int>());

V.TH VIN ALGORITHM


Nh gii thiu trong cc phn trc, STL cung cp cc thut ton c bn nhm mc ch gip bn khng phi code li nhng gii thut qu c bn nh (sp xp, thay th, tm kim...). Cc cng c ny khng nhng gip bn rt ngn thi gian lp trnh m cn c thi gian g ri khi thut ton c bn c ci t khng chnh xc. Ngoi ra, vi STL Algorithm, bn c nhiu la chn cho nhng thut ton c bn. V d, vi thut ton sp xp, bn c th la chn gia thut ton sp xp nhanh (quicksort) cho kt qu rt nhanh vi phc tp NlogN trong a s cc trng hp, nhng li c phc tp N*N trong trng hp xu nht v thut ton sp xp vung ng (heapsort) chy chm hn quicksort nhng c phc tp trong mi trng hp l NlogN. Ch rng cc thut ton ca STL Algorithm c th p dng cho mi kiu iterator, k c con tr thng (khng phi l iterator ca STL). Nh vy, cc thut ton sp xp, tm kim, thay th khng nhng p dng c cho cc kiu vector, list... m cn c th p dng cho mng thng thng. khai bo s dng STL algorithm, cc bn phi include file header algorithm: #include <algorithm>

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 59
Do th vin <algorithm> gm rt nhiu hm khc nhau, trong khun kh ti liu ny khng th nu ht c, xin gii thiu s lc mt s nhm hm sau: - Nhm cc hm khng thay i container - Nhm cc hm thay i container - Nhm cc hm sp xp - Nhm cc hm trn danh sch c sp xp - Nhm cc lm trn heap - Nhm cc hm tm min/max 1. NHM CC HM KHNG THAY I CONTAINER Cc thut ton tm kim, bao gm find(), find_if() tm theo iu kin, search() dng so khp 1 chui lin tip cc phn t cho trc, hm search_n tm kim vi s ln lp xc nh, hm find_end tm kt qu cui cng, find_first_not_of(), find_last_not_of() //find int A[] = {3,4,2,6,3,1,2,3,2,3,4,5,6,4,3,2,1}; int N = sizeof(A) / sizeof(*A); int first = find(A, A+N, 1) - A; cout << "So thu tu cua phan tu dau tien = 1: " << first << endl; //find_if vector<int>::iterator it; it = find_if(v.begin(),v.end(), IsOdd ); first = it - v.begin(); cout << "Phan tu le dau tien la " << *it << " o vi tri thu " << first << endl; //search string A = "Xin chao tat ca moi nguoi !"; string B = "chao"; int vitri = search(A.begin(), A.end(), B.begin(), B.end()) - A.begin(); cout << "Vi tri dau tien xuat hien B trong A: " << vitri << endl; Cc thut ton m: Hm count dng m s lng phn t trong mt chui cc phn t cho trc list<string> l;l.push_back("hello");l.push_back("world"); cout<<(int)count(l.begin(),l.end(),"hello")<<endl; Hm count_if dng m s lng phn t tha mt iu kin no trong mt chui cc phn t cho trc, hm cn mt predicate mt i s class IsOdd { public: bool operator()(int n) const{return (n%2)==1;} }; int main(int argc, char* argv[]) { list<int> l;for(int i=0;i<10;i++) l.push_back(i); cout<<(int)count_if(l.begin(),l.end(),IsOdd())<<endl; } 2. NHM CC HM THAY I CONTAINER

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 60
Hm fill t mt vng gi tr ca 1 container (thng l 1 mng, 1 vector) vector<int> v(8); fill(v.begin(),v.begin()+4,5); fill(v.begin()+3,v.end()-2,8); // v: 0 0 0 0 0 0 0 0 // v: 5 5 5 5 0 0 0 0 // v: 5 5 5 8 8 8 0 0

Hm generate s sinh tng phn t trong khong no y ca vector bng cch gi hm c ch nh ( mt hm tr v cng kiu v khng c i s) template <class ForwardIterator, class Generator> void generate(ForwardIterator first, ForwardIterator last, Generator gen); V d vi hm rand(): vector<int> V; srand( time(NULL) ); //... generate( V.begin(), V.end(), rand );

Hm for_each dng duyt tng phn t trong mt chui cc phn t cho trc Dng for_each in ra cc phn t, v d: void display(const string& s){cout<<s<<endl;} list<string> l;l.push_back("hello");l.push_back("world"); for_each(l.begin(),l.end(),display); Tng t dng vi mt functor: template<typename T>class Output { public: void operator()(const T& t){cout<<t<<endl;} }; int main(int argc, char* argv[]) { list<string> l;l.push_back("hello");l.push_back("world"); for_each(l.begin(),l.end(),Output<string>()); }

Hm transform: phn t c sa i tng ci trong mt phm vi theo mt chc nng m bn cung cp. Hm ny c hai phin bn: int increase(int i){return ++i;} vector<int> v2; v2.resize(v1.size()); transform(v1.begin(),v1.end(),v2.begin(),increase); Phin bn th nht s ly tt c phn t t v1.begin() n v1.end(), transform chng bng hm increase, sau chp gi tr transform vo bt u t v2.begin() int addition(int i,int j){return i+j;} vector<int> v3;

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 61
v3.resize(v1.size()); transform(v1.begin(),v1.end(),v2.begin(),v3.begin(),addition); Phin bn th hai s ly tt c phn t t v1.begin() n v1.end(), transform chng bng hm addition vi i s th hai l tt c phn t t v2.begin(), sau chp gi tr transform vo bt u t v3.begin() Thay th cc gi tr (replace) int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 }; vector<int> a (myints, myints+8); // 10 20 30 30 20 10 10 20 replace(a.begin(), a.end(), 20, 99); // 10 99 30 30 99 10 10 99 Hm replace_if cho php tm gi tr theo iu kin do mt hm tr v. s dng lnh ny bn phi khai bo 1 hm c gi tr tr v l bool nhn tham s l gi tr ca 1 element. Khi hm tr v true, gi tr tng ng s b thay th bi gi tr mi. Hm kim tra nn khai bo inline tc nhanh hn. vector<int> a; // set some values: for (int i=1; i<10; i++) a.push_back(i); replace_if(a.begin(), a.end(), SoLe, 0); o ngc containter (reverse) vector<int> a; // set some values: for (int i=1; i<10; ++i) a.push_back(i); // 1 2 3 4 5 6 7 8 9 reverse(a.begin(),a.end()); // 9 8 7 6 5 4 3 2 1 Copy iterator ( tng t memcpy() i vi pointer ) int a[] = {1, 2, 3, 4, 5, 6}; int n = sizeof(a)/sizeof(*a); vector<int> v1(a, a+n); vector<int> v2(n); copy(v1.begin(), v1.end(), v2.begin()); //copy_n(v1.begin(), v1.size(), v2.begin()); copy(V.begin(), V.end(), ostream_iterator<int>(cout, " ")); Xa vi remove v remove_if V d 1: //remove int A[] = {3,1,4,1,5,9}; int N = sizeof(A)/sizeof(*A); vector<int> V(A, A+N); vector<int>::iterator new_end = remove(V.begin(), V.end(), 1); V.resize(new_end - V.begin()); copy(V.begin(), V.end(), ostream_iterator<int>(cout, " ")); // The output is "3 4 5 9". V d 2:

// 1 2 3 4 5 6 7 8 9 // 0 2 0 4 0 6 0 8 0

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 62
#include <iostream> #include <algorithm> #include <vector> using namespace std; bool IsOdd(int x) { return x%2; } int main() { int a[] = {3,1,4, 8, 5, 2, 9}; int n = sizeof(a)/sizeof(*a); vector<int> vec(a, a+n); vector<int>::iterator new_end = remove_if( vec.begin(), vec.end(), IsOdd ); vec.erase(new_end, vec.end()); copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " ")); // The output is "4 8 2". return 0; } Cc hm c hu t _copy nh remove_copy, remove_if_copy, replace_copy, replace_if_copy, reverse_copy s dng tng t nhng to ra v thao tc trn bn sao container

3. NHM CC HM SP XP Hm sort ( quicksort ) Hm ny c 2 phin bn: +Sp xp li mt chui phn t theo th t tng dn (ascending) sort (v.begin(),v.end()); +Sp xp li mt chui phn t tha mt binary predicate sort(A, A+N, greater<int>() ); Hoc: template<typename T>class Bigger{ public: bool operator()(const T& t1,const T& t2){return t1>t2;} }; template<typename T>class Output{ public: void operator()(const T& t){cout<<t<<endl;} }; int main(int argc, char* argv[]){ vector<int> v;for(int i=0;i<10;i++) v.push_back(i);

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 63
sort(v.begin(),v.end(),Bigger<int>()); for_each(v.begin(),v.end(),Output<int>()); return 0; } Hm is_sorted kim tra xem 1 chui c sp xp hay cha: int A[] = {1, 4, 2, 8, 5, 7}; const int N = sizeof(A) / sizeof(int); assert(!is_sorted(A, A + N)); sort(A, A + N); assert(is_sorted(A, A + N)); 4.NHM CC HM TRN DANH SCH C SP XP Mt s thut ton nh tm kim, thm vo danh sch... hot ng nhanh hn ( phc tp l log2n thay v n). Th vin <algorithm> h tr mt s hm lm vic ring vi cc danh sch sp xp theo th t tng dn. Tm cn di v cn trn (lower_bound, upper_bound) Hm lower_bound(first, last, value) tr v iterator ca element cui cng trong danh sch sp xp c gi tr khng vt qu [value]. Hm upper_bound(first, last, value) tr v iterator ca element u tin c gi tr ln hn [value]. int myints[] = {10,20,30,30,20,10,10,20}; int size = sizeof(myints)/sizeof(myints[0]); vector<int> v(myints,myints+size); // 10 20 30 30 20 10 10 20 vector<int>::iterator low,up; sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30 low=lower_bound (v.begin(), v.end(), 20); up= upper_bound (v.begin(), v.end(), 20); cout << "lower_bound tro vao vi tri: " << int(low- v.begin()) << endl;//3 cout << "upper_bound tro vao vi tri: " << int(up - v.begin()) << endl;//6 Tm kim nh phn (binary_search) Hm binary_search(first, last, value) tr v true nu tm thy gi tr value trong danh sch sp xp t first n last. int myints[] = {1,2,3,4,5,4,3,2,1}; int size = sizeof(myints)/sizeof(myints[0]); vector<int> v(myints,myints+size); sort (v.begin(), v.end(), greater<int>() ); cout << "Tim phan tu 6... "; if (binary_search (v.begin(), v.end(), 6, LonHon)) cout << "Tim thay! \n"; else cout << "Khong tim thay! \n"; Trn 2 danh sch c sp xp (merge)

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 64
int first[] = {5,10,15,20,25}; int second[] = {50,40,30,20,10}; vector<int> v(10); vector<int>::iterator it; sort (first,first+5); sort (second,second+5); merge (first,first+5,second,second+5,v.begin()); //5 10 10 15 20 20 25 30 40 50 Cc php ton trn tp hp: Xc nhn tp con includes int A1[] = { 1, 2, 3, 4, 5, 6, 7 }; int A2[] = { 1, 4, 7 }; int A3[] = { 2, 7, 9 }; const int N1 = sizeof(A1) / sizeof(int); const int N2 = sizeof(A2) / sizeof(int); const int N3 = sizeof(A3) / sizeof(int); cout << "A2 contained in A1: " << (includes(A1, A1 + N1, A2, A2 + N2) ? "true" : "false") << endl; cout << "A3 contained in A1: " << (includes(A1, A1 + N2, A3, A3 + N3) ? "true" : "false") << endl; Hp (set_union) int first[] = {5,10,15,20,25}; int second[] = {50,40,30,20,10}; vector<int> v(10); vector<int>::iterator it; sort (first,first+5); sort (second,second+5); vector<int>::iterator end_it=set_union (first, first+5, second, second+5, v.begin()); copy(v.begin(), end_it, ostream_iterator<int>(cout, " ")); //5 10 15 20 25 30 40 50 Giao (set_intersection) int first[] = {5,10,15,20,25}; int second[] = {25,40,15,20,10}; vector<int> v(10); vector<int>::iterator it; sort (first,first+5); sort (second,second+5); vector<int>::iterator end_it =set_intersection(first, first+5, second, second+5, v.begin()); //10 15 25

Php loi ( set_difference ) ly ra cc phn t sai khc int first[] = {5,10,10,20,25}; int second[] = {25,40,15,20,5}; vector<int> v(10); vector<int>::iterator it; sort (first,first+5); sort (second,second+5);

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 65
vector<int>::iterator end_it =set_difference(first, first+5, second, second+5, v.begin()); //10 10 15 40 Php tr tp hp ( set_symmetric_difference ) gn ging set_difference nhng khc ch nu c 1 phn t lp n ln tp 1 v m ln tp 2 th n s xut hin |m-n| ln output.

5. CC HM TRN HEAP Bao gm to heap (make_heap), thm phn t vo heap (push_heap), xa phn t khi heap (pop_heap), sp xp heap (sort_heap) // range heap example #include <iostream> #include <algorithm> #include <vector> using namespace std; int main () { int myints[] = {10,20,30,5,15}; vector<int> v(myints,myints+5); vector<int>::iterator it; make_heap (v.begin(),v.end()); cout << "initial max heap : " << v.front() << endl; pop_heap (v.begin(),v.end()); v.pop_back(); cout << "max heap after pop : " << v.front() << endl; v.push_back(99); push_heap (v.begin(),v.end()); cout << "max heap after push: " << v.front() << endl; sort_heap (v.begin(),v.end()); cout << "final sorted range :"; for (unsigned i=0; i<v.size(); i++) cout << " " << v[i]; return 0; } 6,CC HM TM MIN & MAX Tm min & max trong 1 cp: const int x = min(3, 9), y = max(3, 9); assert(x == 3); assert(y == 9); Tm min & max trong 1 tp int A[] = {3,4,2,6,3,1,2,3,2,3,4,5,6,4,3,2,1}; int N = sizeof(A) / sizeof(*A); cout << "So nho nhat trong mang: " << *min_element(A, A+N) << endl; cout << "So lon nhat trong mang: " << *max_element(A, A+N) << endl;

VI. CC B TNG THCH

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 66
1.CONTAINER ADAPTER (CC B TNG THCH LU TR) Bao gm stack, queue v priority_queue Gi l cc b tng thch bi v n lm cc b lu tr khc tr nn tng thch vi n bng cch ng gi (encapsulate) cc b lu tr khc tr thnh b lu tr c s ca n. V d: stack<int,vector<int> > s; Khi vector tr thnh b lu tr c s ca b tng thch stack. Nu khng khai bo b lu tr c s, stack v queue mc nh s dng deque lm b lu tr c s, trong khi priority_queue mc nh s dng vector lm b lu tr c s, c ngha l khi khai bo stack<int> s; thc ra l stack<int,deque<int> > s; Lu 2 c stack v queue u c cc hm sau void push(T) thm phn t vo void pop(T) g phn t ra stack c thm hm T top() truy xut phn t nh queue c thm hm: T front() truy xut phn t tip theo T back() truy xut phn t cui cng ca queue priority_queue l queue trong phn t u tin lun lun l phn t ln nht theo mt tiu chun sp xp no , priority_queue ging nh khi nim heap (ng) m ta bit (heap v gii thut heapsort trong mn CTDL) Thc ra priority_queue ch l queue mc nh c ci sn thm comparator less<T> ging nh cc associative container thi. Ta c th ci li comparator do ta nh ngha cho n (v d bi di y ci greater<T>)

#include <queue> class Plane{ int fuel; public: Plane(int fuel){(*this).fuel=fuel;} friend ostream& operator<<(ostream& os,const Plane& p){ os<<p.fuel<<endl;return os;} bool operator>(const Plane& p) const{ return fuel>p.fuel;} }; typedef priority_queue<Plane,vector<Plane>,greater<Plane> > PriorityQueuePlane; int main(){ vector<Plane> vP; vP.push_back(Plane(4));vP.push_back(Plane(7)); vP.push_back(Plane(3));vP.push_back(Plane(9)); PriorityQueuePlane v(vP.begin(),vP.end()); while(!v.empty()){ cout<<v.top();v.pop(); } return 0; }

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 67
Lu l priority_queue c push, pop v top, khng c front v back

2.ITERATOR ADAPTER (CC B TNG THCH CON TR)

Cc b tng thch iterator thay i cc vn hnh ca iterator, thng l lm container v iterator khc tr nn tng thch vi n, bng cch ng gi (encapsulate) cc container v iterator khc tr thnh container v iterator c s ca n. Chng c dng khai bo c bn nh sau: #include<iterator> template<class Container,class Iterator> class IteratorAdapter { //ni dung }; IteratorAdapter<vector<int>,vector<int>::iterator> vectorIntAdapter;

Mt s Adapter thng c s dng l reverse_iterator, insert_iterator, back insert iterator, front insert iterator list<int> L; L.push_front(3); back_insert_iterator<list<int> > ii(L); *ii++ = 0; *ii++ = 1; *ii++ = 2; copy(L.begin(), L.end(), ostream_iterator<int>(cout, " ")); // The values that are printed are 3 0 1 2

Khng hc thm v iterator adapter

3.FUNCTION ADAPTER (CC B TNG THCH HM)

C 2 b tng thch hm chng ta hc trc l bind1st v bind2nd. Chng ta sp hc not1, not2, mem_fun, mem_fun_ref v ptr_fun. Tt c u nm trong th vin functional not1 i gi tr tr v ca mt unary predicate t false thnh true v ngc li, unary predicate phi c nh ngha l unary_function V d dng IsOdd tm cc s chn (ngha l IsOdd tr v not(true)) class IsOdd:public unary_function<int,bool>{ public:bool operator()(const int& n) const{return n%2;} }; int main(int argc, char* argv[]){ int a[] = {1,2,3,4,5}; cout<<count_if(a,a+5,not1(IsOdd()))<<endl; return 0; }

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 68
not2 i gi tr tr v ca mt binary predicate t false thnh true v ngc li, binary predicate phi c nh ngha l binary_function V d dng compare so snh 2 mng vi cc phn t khng bng nhau (ngha l compare tr v not(true)) class compare:public binary_function<int,int,bool>{ public:bool operator()(int i,int j) const{return i==j;} }; int main(int argc, char* argv[]){ int a[] = {1,2,3,4,5}; int b[] = {6,7,8,9,10}; cout<<equal(a,a+5,b,not2(compare()))<<endl; return 0; } ptr_fun Chuyn mt con tr hm (function pointer) thnh mt functor. Bn c c th thc mc functor hn function pointer im no m li cn chuyn nh vy. Cu tr li l tc : A suitably-defined object serves as well as - and often better than - a function. For example, it is easier to inline the application operator of a class than to inline a function passed as a pointer to function. Consequently, function objects often execute faster than do ordinary functions- Stroustrup. i l nu kt hp vi t kha inline th functor cho tc cao hn function int addition(int a,int b){return a+b;} int output(int a){cout<<a<<endl;return 0;} int(*cong)(int,int) = addition; int(*xuat)(int) = output; int main() { int a[] = {1,2,3,4,5}; int b[] = {6,7,8,9,10}; int c[5]; transform(a,a+5,b,c,ptr_fun(cong)); for_each(c,c+5,ptr_fun(xuat)); return 0; } y chng ta c binary function l addition v unary function l output, v binary function pointer l cong v unary function pointer l xuat, v ta dng ptr_fun chuyn cc con tr hm ny thnh binary functor v unary functor ng vai tr predicate dng trong hai hm transform v for_each Xt 1 v d khc: #include<numeric> double acc(double total, double elements){ return total+elements; } int main(){ multiset<double> s; for(int i=0;i<6;i++) s.insert(0.3);

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 69
double sum = accumulate(s.begin(),s.end(),0.0,ptr_fun(acc)); } y dng ch c hm accumulate ( ca th vin <numeric> ).Hm ny c truyn vo functor acc (do ptr_fun chuyn t function thnh functor) tham s l total = 0.0 v ln lt l cc phn t ca set, sau acc tnh tng total v cc element ri tr v accumulate tch ly v cui cng tr gi tr ra bin sum. ptr_fun ch dng cho stand-alone v static member function, vi non-static member function phi 2 hm di y: mem_fun v mem_fun_ref

+mem_fun Chuyn mt hm thnh vin (member function) ca mt lp thnh mt functor v truyn vo functor ny cc i s l cc con tr m tr n cc i tng ca lp class Person{ int age; public: Person(int age):age(age){} int display(){cout<<age<<endl;return 0;} }; int main(){ list<Person*> l; l.push_back(new Person(4)); l.push_back(new Person(5)); for_each(l.begin(),l.end(),mem_fun(&Person::display)); return 0; } +mem_fun_ref Chuyn mt hm thnh vin (member function) ca mt lp thnh mt functor v truyn vo functor ny cc i s l cc tham chiu m tham chiu n cc i tng ca lp class Person{ int age; public: Person(int age):age(age){} int display(){cout<<age<<endl;return 0;} }; int main(){ list<Person> l; l.push_back(Person(4)); l.push_back(Person(2)); l.push_back(Person(5)); for_each(l.begin(),l.end(),mem_fun_ref(&Person::display)); return 0; } Mc ch chnh l tng hiu sut chng trnh, th cc k quan trng trong lp trnh game. Tng tng bn s phi gi 1 cu lnh nh th ny for(list<Person*>::iterator i=l.begin();i!=l.end();i++) (**i).display();

S T L ( S t a n d a r d T e m p l a t e L i b r a r y ) | 70
gi ti tng hm thnh vin ca tng phn t ca list, gim hiu sut kinh khng Thay vo dng mem_fun hay mem_fun_ref, ch cn truyn vo mt con tr hay mt tham chiu ti hm thnh vin, tng hiu sut r rt.

KHUYN CO: ptr_fun v mem_fun hay mem_fun_ref, c 3 hm ny u tr li functor, c s dng rt nhiu v tng tc v hiu sut chng trnh. So snh gia cc ngn ng vi nhau, nh vo nhng c im nh con tr, etc, cng vi nhng hm tin ch c bit trong STL nht l 3 hm ny, cng t c mt mc ch th dng C++ t c tc v hiu sut hn bt k ngn ng bc cao no khc. Do hiu v s dng nhun nhuyn 3 hm ny gip tng performance ca chng trnh.

You might also like