Download as pdf or txt
Download as pdf or txt
You are on page 1of 16

STL Vector | 1

S DNG STL VECTOR


I.Gii thiu :
Lp mng ng vector<T> c sn trong th vin chun STL ca C++ cho php nh ngha mt mng ng cc phn t kiu T, vector c cc tnh cht sau: - Khng cn phi 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. - H tr tt c cc thao tc c bn nh chn ,xa, sao chp ..

II.V sao dng vector :

Ki u vector c th coi l kiu mng trong l p trnh C truyn thng. Mng l tp hp cc gi tr cng kiu, c sp xp ni tip nhau. Cc phn t ca mng c th c truy cp ngu nhin qua ch s. Vn t ra: Nu vector l mng th ti sao li phi s dng vector khi bn qu quen thuc vi mng? Xin phn tch mt s nhc im sau ca mng: - Nu bn s dng mng tnh: Mng ny lun c khai bo vi kch thc ti a m bn c th dng dn n tn nhi u vng nh tha. - Nu bn s dng mng ng: Bn phi xin cp pht b nh, lm vic vi con tr. Con tr l khi ni m hay trong C, C++, nhng n l nguyn nhn ca rt nhiu rc ri trong lp trnh. - Khng thun tin trong vic truyn tham s kiu mng vo hm hay tr li kiu mng t hm. - Nhc im quan trng nht: Nu bn s dng mng vt ch s vt qu kch thc khai bo, C++ s khng thng bo l i, iu ny dn n l i dy chuyn do cc lnh l i tc ng n cc bi n khc trong chng trnh (trong Pascal bn c th kim tra trn ch s mng bng dn bin dch range check). Vector l mt container cung cp kh nng s dng mng mm do, c kim sot range check khi cn thi t, vi kch thc ty (m khng cn phi s dng con tr). Ngoi ra vector cho php bn chn thm hoc xa i mt s phn t ch bng 1 lnh (khng phi s dng vng lp nh i vi mng).

III.C php :
c th dng vector th bn phi thm 1 header #include <vector> v phi c using std::vector; v vector c nh ngha trong STL( Standard Template Library). C php ca vector cng rt n gin v d : vector<int> A ; Cu lnh trn nh ngha 1 vector c kiu int. Ch kiu ca vector c trong 2 ci ngoc nhn. V kck thc ca vector c th nng ln, cho nn khng cn khai bo cho n c bao nhi u phn t cng c, hoc nu thch khai bo th bn cng c th khai bo nh sau : vector<int> A(10); Cu lnh trn khai bo A l 1 vector ki u int c 10 phn t. Tuy nhin nh ni trn, mc d size = 10, nhng khi bn add vo th n vn cho php nh thng. Cng c th khi to cho cc phn t trong vector bng c php n gin nh sau : vector<int> A(10, 2);

STL Vector | 2
Trong cu ln trn 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 ); hiu r hn v vector, bn hy theo di v d sau: #include <iostream> // Th vin iostream phc v ghi d li u ra mn h.nh #include <vector> // Th vin vector, s dng kiu vector #include <conio.h> // Th vin conio (s dng hm getchar() dng ct) using namespace std; // S dng namespace std int main() { vector<int> V(3); // V ki u vector s nguyn (s dng gi ng mng int[3]) V[0] = 5; // Gn gi tr cho cc phn t ca bin V V[1] = 6; // S dng du mc [] hon ton ging vi mng V[2] = 7; for (int i=0; i<V.size(); i++) // Ghi gi tr cc phn t ca V ra mn h.nh cout << V[i] << endl; // Nu s dng mng, bn phi c bi n lu kch thc getchar(); // Dng chng trnh xem kt qu } V d trn cho bn thy vi c 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 (default constructor) khai bo mng cha xc nh kch thc, sau dng phng thc resize() xc nh kch thc ca mng khi cn. Chng trnh sau y nhp vo n t (word) mi t l mt chui kiu string:

#include <iostream> #include <string> #include <vector> using namespace std; int main() { int iWordNum; vector<string> arrWords; cout << "Enter number of words = "; cin >> iWordNum; arrWords.resize(iWordNum); for (int i = 0; i < arrWords.size(); i++) { cout << "Enter word " << i << " = "; cin >> arrWords[i]; } cout << "After entering data..." << endl; for (int i = 0; i < arrWords.size(); i++) cout << arrWords[i] << endl; } Output Enter number of words = 3 Enter word 1 = hello Enter word 1 = c++s

STL Vector | 3
Enter word 1 = world After entering data... hello c++s world Press any key to continue . . .

IV.Cc phng thc:


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

#include <iostream> #include <vector> using namespace std; int main() { int i; vector<int> V; for (i=0; i<5; i++) // Lp 5 ln, mi l n 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; } 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

Xa ti v tr bt k, xa trng

STL Vector | 4
#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; } Output: vector truoc khi xoa Xin chao tat ca cac ban vector sau khi xoa xin ban Vector sau khi clear co 0 phan tu

Phng thc chn


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

STL Vector | 5
//chn 2 l n 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

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

STL Vector | 6
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() : #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 gi ng 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, vi c ny lp i lp li s l m gi m performance trong khi c nhng trng hp ta c th c lng c cn s dng bao nhi u 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 (gi ng vi c hon i gi tr ca 2 bi n kiu s). V d : v1.swap(v2);

V.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), bi t v kh nng ny, chng ta li ti p tc vi mt v d mi: #include <iostream> #include <vector> #include <conio.h>

STL Vector | 7
using namespace std; int main() { try { // s dng try...catch by li 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; } Lp trnh C++ Nguyn Ph Qung Trong v d ny, chng ta li c thm mt s kinh nghim sau: - Nu s dng c php bi n_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 bi t 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 l nh V.at(3), lnh ny khng cho ra kt qu m to thnh thng bo li.

VI.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++) 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 d.ng (v d mng 2 chiu l na trn ca ma trn)

VII.S dng iterator

STL Vector | 8
Container ( thng cha ) : mt kiu cu trc d liu dng lu tr thng tin. V d: mng (array), list, vector, deque... Container no cng c cc phng thc sau y Phng thc M t size() S lng phn t empty () Tr v 1 nu container rng, 0 nu ngc li. max_size() Tr v s lng phn t ti a c cp pht == Tr v 1 nu hai container ging nhau != Tr v 1 nu hai v khc nhau begin() Tr v iterator u tin ca container end() Tr v iterator lp cui cng ca container front() Tr v tham chiu n phn t u ti n ca container back() Tr v tham chiu n phn t cui cng ca container swap() Hon i 2 container vi nhau (ging vic hon i gi tr ca 2 bin)

Trong th vin STL th ngi ta tch hp lp i tng Iterator (b lp hay bi n l p) cng vi cc container.T tng th hin nh sau: 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; o Khai bo l p Iterator nh l 1 lp nm trong lp lu tr. o 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 ti n ca nm trong i tng lp lu tr. 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. o 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 vector, m tng qut hn l vi 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; //.. } Di y chng ta xt 1 v d l m vi c vi th vin STL vi lp vector v con tr kiu iterator nh sau: #include<iostream> #include<vector> using std::vector; void main() { vector<int> v; for(int i = 10; i < 15; i++) v.push_back(i); vector<int>::iterator it = v.begin(); while(it != v.end()) { cout << *it << " "; it++;

STL Vector | 9
} }

V iterator nh ngha bn trong cc container th no l phn t u, phn t cui, phn t tip theo nn n cha thng tin cu trc phc v cho vic duyt container. N che i cu trc bn trong v cho php ta vit cc on m tng qut duyt hay chn phn t trn cc container khc nhau m khng cn bit cu trc ca container ra sao.

Trong cc reversible container nh vector cn nh ngha thm reverse_iterator (ci tn ni ln chc nng: iterator nghch o) l nested class vi cc hng tng ng: vector<T>::reverse_iterator rbegin(); vector<T>::reverse_iterator rend(); V d : duyt vector theo 2 chiu #include <iostream> #include <algorithm> #include <stdlib.h> #include <vector> using namespace std; int main() { int A[] = {3,2,3,1,2,3,5,3}; int n = sizeof(A)/sizeof(*A); vector<int> V; for (int i=0; i<n; i++){ V.push_back(A[i]); vector<int>::iterator vi; cout << endl << "Duyet chieu xuoi" << endl; for (vi=V.begin(); vi!=V.end(); vi++) cout << *vi << endl; vector<int>::reverse_iterator rvi; cout << endl << "Duyet theo chieu nguoc" << endl; for (rvi=V.rbegin(); rvi!=V.rend(); rvi++) cout << *rvi << endl; getchar(); } Chuyn i qua li gia reverse_iterator v iterator: 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); 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);

STL Vector | 10
*Lnh assert(); dng kim tra mt biu thc iu kin. Iterator l 1 trong 4 thnh phn chnh ca STL (container, iterator, algorithm v functor).Container v algorithm giao tip qua n: nhiu hm v algorithm trong STL nhn cc i s l iterator.Iterator gn li n vi tt c cc loi container, y l khi nim bn cn nm rt vng nu mun lm vic tt vi STL 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 ti n 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. Xa mt phn t c ch bi i. Tr v mt bi n lp ch n phn t sau phn t c xa. Xa nhng phn t trong dy t start n end. Tr v mt bin lp ch n phn t sau cng ca vector. Tr v mt tham chiu n phn t u ti n ca vector. 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. 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. Tr v mt bin lp nghch ch im bt u ca vector. Thit l p 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

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

Iterator erase(iterator start, iterator end);

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

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); Reverse_iterator rbegin(); Const_reverse_iterator rbegin() const; Reverse_iterator rend(); Const_reverse_iterator rend() const; Void reverse (size_type num); Void resize (size_type num, T val =T());

Size_type size() const;

STL Vector | 11
Vois swap(vector<T, Allocator>&ob) trong vector. Chuyn i nhng phn t c lu trong vector hin thi vi nhng phn t trong ob.

VIII.Dng 1 s hm c bn trong th vin algorithm Khi to:


Bn c th s dng lnh fill ca th vin <algorithm> t mt vng gi tr ca 1 container (thng l 1 mng, 1 vector) // fill algorithm example #include <iostream> #include <algorithm> #include <vector> using namespace std; void printint(const int &i) { cout << i << endl; } int main () { 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

cout << "vector contains:"; for_each( v.begin(), v.end(), printint ); return 0; } template <class ForwardIterator, class Generator> void generate(ForwardIterator first, ForwardIterator last, Generator gen); 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) V d vi hm rand(): vector<int> V; srand( time(NULL) ); //... generate( V.begin(), V.end(), rand );

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()); for (int i=0; i<n; i++) cout << v2[i] << " "; // The output is "1 2 3 4 5 6".

STL Vector | 12
o ngc (reverse) vector
Bn c th s dng l nh reverse trong <algorithm> o ngc container ( y l 1 vector ) // reverse algorithm example #include <iostream> #include <algorithm> #include <vector> tr.nh C++ Nguyn Ph Qung #include <conio.h> using namespace std; int main () { 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 // print out content: cout << "a contains:"; int i, n = a.size(); for (i=0; i<n; i++) cout << a[i] << " "; cout << endl; getchar(); }

Thay th cc gi tr (replace)
Lnh replace tm kim 1 gi tr trong container, y l vector thay th gi tr tm c bi gi tr mi. // replace algorithm example #include <iostream> #include <algorithm> #include <vector> #include <conio.h> using namespace std; int main () { 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 cout << "a contains: "; int i, n; for (i=0, n=a.size(); i<n; i++) cout << a[i] << " "; getchar(); }

Thay th cc gi tr theo iu kin (replace_if)


Cc hm c hu t _if nh remove_if, replace_if, find_if, count_if s dng 1 con tr hm hoc 1 functor lm tiu ch tm kim (dng ca con tr hm hoc functor ty vo mc ch s dng) Lnh replace_if cho php tm gi tr theo iu ki n 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 ki m tra nn khai bo inline tc nhanh hn. // replace_if example #include <iostream> #include <algorithm> #include <vector> #include <conio.h> using namespace std;

STL Vector | 13
inline bool SoLe(int i) { return ((i%2)==1); } int main () { 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); cout << "a contains: "; int i, n; for (i=0, n=a.size(); i<n; i++) cout << a[i] << " "; getchar(); }

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

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); copy(V.begin(), V.end(), ostream_iterator<int>(cout, " ")); //The output is "3 1 4 1 5 9". cout << endl; 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: #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 Sp xp container ( y l vector)

STL Vector | 14
#include <iostream> #include <algorithm> #include <vector> using namespace std; void printint(const int &i) { cout << i << endl; } int main() { int A[] = {3,2,3,1,2,3,5,3}; int n = sizeof(A)/sizeof(*A); vector<int> V(A, A+n); cout << endl << "Danh sach ban dau" << endl; for_each( V.begin(), V.end(), printint ); V.sort(); vector<int>::iterator vi; cout << endl << "Danh sach sau khi sap xep" << endl; for_each( V.begin(), V.end(), printint ); getchar(); } Trong v d trn ta hc c cch s dng hm for_each() v sort() thao tc vi 1 container.

Tm kim tuyn tnh


// lineal search #include <iostream.h> #include <algorithm> #include <vector> using namespace std; bool IsOdd(int x) { return x%2; } int main() { int a[] = {2,4,2,6,9,1,2,3,2,3,4,5,6,4,3,2,1}; int n = sizeof(a)/sizeof(*a); vector<int> v(a, a+n); int first = find(a, a+n, 1) - a; //cc hm thut ton hon ton c th thao tc trn mng & con tr thng cout << "[array] so thu tu cua phan tu dau tien = 1: " << first << endl; first = find(v.begin(),v.end(), 1) - v.begin(); cout << "[vector] 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;

STL Vector | 15
return 0; } Ngoi ra cn c nhiu hm tm kim khc: hm search() dng so khp 1 chui li n 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()

m & tm min max


//counting #include <iostream> #include <vector> #include <algorithm> using namespace std; bool IsOdd(int x) { return x%2; } int main() { int a[] = {3,2,3,1,2,4,5,3}; int n = sizeof(a)/sizeof(*a); vector<int> v(a, a+n); cout cout cout cout << "So luong so 3 trong mang: " << count(v.begin(),v.end(), 3) << endl; << "So luong so le trong mang: " << count_if(v.begin(),v.end(), IsOdd) << endl; << "So nho nhat trong mang: " << *min_element(v.begin(),v.end()) << endl; << "So lon nhat trong mang: " << *max_element(v.begin(),v.end()) << endl;;

return 0; }

Hm chuyn i hng lot transform()


Mt trong nhng gii thut th v hn l transform(), phn t c sa i tng ci trong mt phm vi theo mt chc nng m bn cung cp. #include <vector> #include <algorithm> using namespace std; template <class T> T inc(T x) //hm dng chuyn i { return x+1; } int main() { int a[] = {3,2,3,1,2,3,5,3}; int n = sizeof(a)/sizeof(*a); vector<int> v(a, a+n); transform(v.begin(), v.end(), v.begin(), inc<int> ); copy(v.begin(), v.end(), ostream_iterator<int>(cout, " ")); // The output is "4 3 4 2 3 4 6 4". return 0; }

STL Vector | 16
Ngoi ra cn nhiu hm thut ton khc c th tham kho trong ti liu reference ca c++

You might also like