S DNG STL VECTOR TRONG C++
Nguyn Trí Hi
11520094
KHMT06
I) Gii thiu:
Lp mảng động vector<T> có sn trong thư vin chun STL ca C++ cho phép định nghĩa
mt mảng đng các phn t kiu T, vector có các tính cht sau:
- Không cn phi khai báo kích thước ca mng vector có th t động cp phát b nh, bn s
không phải quan tâm đến qunkích thước ca nó.
- Vector còn có th cho bn biết s lượng các phn t mà bn đang lưu trong nó.
- Vector có các phương thức ca stack.
- H tr tt c các thao tác cơ bản như chèn ,xóa, sao chép ..
II) Vì sao dùng Vector:
Kiu vector th coi kiu mng trong lp trình C truyn thng. Mng tp hp các giá
tr ng kiểu, được sp xếp ni tiếp nhau. Các phn t ca mng có th đưc truy cp ngu
nhiên qua ch s.
Vấn đề đt ra: Nếu vector mng thì ti sao li phi s dng vector khi bn đã quá
quen thuc vi mng?
- Nếu bn s dng mng tĩnh: Mảng y luôn được khai báo vi kích thước ti đa mà bn có
th ng dẫn đến tn nhiu vùng nh tha.
- Nếu bn s dng mảng động: Bn phi xin cp phát b nh, làm vic vi con tr. Con tr là
khái niệm hay trong C, C++, nhưng nó là nguyên nhân của rt nhiu rc ri trong lp trình.
- Không thun tin trong vic truyn tham s kiu mng vào hàm hay tr li kiu mng t
m.
- Nhược điểm quan trng nht: Nếu bn s dng mng vượt ch s vượt q kích thước đã
khai báo, C++ s không thông báo lỗi, điều này dn đến li y chuyn do các lnh li đã tác
động đến các biến khác trong chương trình
Vector là mt container cung cp kh năng sử dng mng mm do, kim soát range
check khi cn thiết, vi kích thước y ý (mà không cn phi s dng con tr). Ngoài ra
vector cho phép bn chèn thêm hoặc xóa đi một s phn t ch bng 1 lnh (không phi s
dng vòng lp như đối vi mng).
III) Cú pháp:
Để dùng vector thì cn thêm 1 header #include <vector> và phi using std::vector; vì
vector được định nghĩa trong STL (Standard Template Library)
Ví d:
vect or <i nt > A;
Câu lnh trên đnh nghĩa 1 vector kiu int. Kiểu vector được đt trong 2 du ngoc nhn.
Kích thước ca vector th t nâng lên nên không cn khai báo s phn t hoc nếu mun
khai báo thì bn có th khai báo như sau:
vect or <i nt > A( 10) ;
Câu lnh trên khai báo A 1 vector kiu int 10 phn t. Mc dù size ca bng 10
nhưng sử dngn vẫn được.
Ta có th khi to giá tr mặc đnh cho vector:
vect or <i nt > A( 10, 2) ;
Câu lnh trên khai báo 10 phn t vector A được khi to bng 2. Đồng thi ta cũng thể
khi to cho 1 vector s là bn sao ca 1 hoc 1 phn vector khác, ví d :
vect or <i nt > A( 10, 2) ;
vect or <i nt > B( A) ;
vect or <i nt > C( A. begi n( ) , A. begi n( ) + 5 ) ;
Để hiu rõ vè vector, ta xem đon code sau:
#i ncl ude <i ost r eam> // Thư viện i ost r eam phc v ghi d l i u r a màn hì nh
#i ncl ude <vect or > // Thư viện vect or , s dng ki u vect or
usi ng namespace st d; / / S dng namespace st d
i nt mai n( )
{
vect or <i nt > V( 3) ;
/ / V ki u vect or s nguyên ( s dng gi ng mng i nt [ 3] )
V[ 0] = 5;
/ / Gán gi á t r cho các phn t ca bi ến V
V[ 1] = 6;
/ / S dng du móc [ ] hoàn t n gi ng vi mng
V[ 2] = 7;
f or ( i nt i =0; i <V. si ze( ) ; i ++)
/ / Ghi gi á t r các phn t ca V r a màn hì nh
cout << V[ i ] << endl ;
/ / Nếu s dng mng, bn phi có bi ến lưu kích thước
}
Ví d trên cho bn thy vic s dng vector rất đơn giản, hoàn toàn ging vi mảng nhưng b
nh được qun t động, bn không phi quan tâm đến gii phóng các vùng b nh đã xin
cp phát.
Trưng hợp xác định kích thước mng khi chương trình đang chạy, chúng ta dùng hàm dng
mặc định (default constructor) đ khai o mảng chưa xác định kích thước, sau đó ng
phương thức resize() đ xác định kích thước ca mng khi cần. Chương trình sau đây nhập
o n t (word) mi t là mt chui kiu string:
#i ncl ude <i ost r eam>
#i ncl ude <st r i ng>
#i ncl ude <vect or >
usi ng namespace st d;
i nt mai n( )
{
i nt i Wor dNum;
vect or <st r i ng> ar r Wor ds;
cout << " Ent er number of wor ds = " ;
ci n >> i Wor dNum;
ar r Wor ds. r esi ze( i Wor dNum) ;
f or ( i nt i = 0; i < ar r Wor ds. si ze( ) ; i ++)
{
cout << " Ent er wor d " << i << " = " ;
ci n >> ar r Wor ds[ i ] ;
}
cout << " Af t er ent er i ng dat a. . . " << endl ;
f or ( i nt i = 0; i < ar r Wor ds. si ze( ) ; i ++)
cout << ar r Wor ds[ i ] << endl ;
}
Ouput:
Enter number of words = 3
Enter word 1 = hello
Enter word 1 = c++’s
Enter word 1 = world
After entering data...
hello
c++’s
world
Press any key to continue . . .
IV) Các phương thức:
c phương thc ca stack: push_back() và pop_back()
#i ncl ude <i ost r eam>
#i ncl ude <vect or >
usi ng namespace st d;
i nt mai n( )
{
i nt i ;
vect or <i nt > V;
f or ( i =0; i <5; i ++)
/ / Lp 5 l n, mi l ần đưa thêm 1 số vào vect or
V. push_back( i ) ;
// Như vậy, vect or có t h được s dụng như stack
cout << endl << " Mang ban dau: " << endl ;
f or ( i =0; i <V. si ze( ) ; i ++)
/ / Ghi l i ni dung ca mng r a màn h. nh
cout << V[ i ] << endl ;
V. pop_back( ) ; / / Xóa phn t va chèn vào đi
cout << endl << " Xoa phan t u cuoi : " << endl ;
f or ( i =0; i <V. si ze( ) ; i ++)
// In ni dung ca vect or sau khi xóa
cout << V[ i ] << endl ;
r et ur n 0;
}
Vi ví d trên, bn có th thy ta có th s dụng vector như 1 stack:
- Không nên dùng toán t [] đ truy xut các phn t không tn ti, nghĩa là d
vector size = 10, mà bn truy xuất 11 là sai. Để thêm vào 1 gtr cho vector mà nó không
size trước hoặc đã full thì ta ng hàm thành viên push_back(), hàm y s thêm 1 phn t
o cui vector.
- Tương tự vi thao tác xóa mt phn t cui ra khi vector, bn cũng ch cn s dng 1
lnh: pop_back( )
Xóa ti v trí bt k, xóa trng:
#i ncl ude <i ost r eam>
#i ncl ude <vect or >
usi ng namespace st d;
t empl at e <cl ass T>
voi d pr i nt ( const vect or <T>&v)
{
f or ( i nt i =0; i < v. si ze( ) ; i ++)
cout << v[ i ] << endl ;
}
i nt mai n( )
{
char * chao[ ] = { " Xi n" , " chao" , " t at " , " ca" , " cac" , " ban" } ;
i nt n = si zeof ( chao) / si zeof ( * chao) ;
vect or <char * > v( chao, chao + n) ;
//đây là 1 cách khởi t o vect or
cout << " vect or t r uoc khi xoa" << endl ;
pr i nt ( v) ;
v. er ase( v. begi n( ) + 2, v. begi n( ) + 5) ;
/ / xóa t phn t t h 2 đến phn t t h 5
v. er ase( v. begi n( ) +1 ) ;
/ / xóa phn t t h 1
cout << " vect or sau khi xoa" << endl ;
pr i nt ( v) ;
v. cl ear ( ) ; / / Xóa t oàn b các phn t
cout << " Vect or sau khi cl ear co "
<< v. si ze( ) << " phan t u" << endl ;
r et ur n 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
Phương thức chèn
i t er at or i nser t ( i t er at or posi t i on, const T& x ) ;
voi d i nser t ( i t er at or posi t i on, si ze_t ype n, const T& x ) ;
voi d i nser t ( i t er at or posi t i on, I nput I t er at or f i r st , I nput I t er at or l ast ) ;
Ví d:
/ / i nser t i ng i nt o a vect or
#i ncl ude <i ost r eam>
#i ncl ude <vect or >
usi ng namespace st d;
i nt mai n ( )
{
vect or <i nt > v1( 4, 100) ;
v1. i nser t ( v1. begi n( ) +3 , 200 ) ;
//chèn 200 vào trước v t r í t h 3
v1. i nser t ( v1. begi n( ) +2 , 2, 300) ;
/ / chèn 2 l n 300 vào trước v t r í t h 2
vect or <i nt > v2( 2, 400) ;
i nt a [ ] = { 501, 502, 503 } ;
v1. i nser t ( v1. begi n( ) +2, a, a+3) ;
/ / chèn mng a ( 3 phn t ử) vào trước v t r í t h 2
v1. i nser t ( v1. begi n( ) +4, v2. begi n( ) , v2. end( ) ) ;
//chèn v2 vào trước v t r í t h 4
cout << " v1 cont ai ns: " ;
f or ( i nt i =0; i < v1. si ze( ) ; i ++)
cout << " " << v1[ i ] ;
r et ur n 0;
}
Output:
v1 contains: 100 100 501 502 400 400 503 100 200 300 300 100
Mt s hàm khác và chức năng
Nhng toán t so sánh: được định nghĩa cho vector: ==, <, <=, !=, >, >=
Tham chiếu back(), front()
t empl at e<cl ass _TYPE, cl ass _A>
r ef er ence vect or : : f r ont ( ) ;
t empl at e<cl ass _TYPE, cl ass _A>
r ef er ence vect or : : back( ) ;
Tr v tham chiếu đến phn t đu và cui vector:
v. f r ont ( ) ฀ v[0] và v. back( ) v[v.size()- 1]
#i ncl ude <i ost r eam>
#i ncl ude <vect or >
usi ng namespace st d;
i nt mai n ( )
{
i nt a[ ] = { 3, 2, 3, 1, 2, 3, 5, 7} ;
i nt n = si zeof ( a) / si zeof ( * a) ;
vect or <i nt > v( a, a+n) ;
cout << " phan t u dau l a " << v. f r ont ( ) << endl ;
cout << " phan t u cuoi l a " << v. back( ) << endl ;
cout << " gan phan t u cuoi l a 9 . . . " << endl ;
v. back( ) = 9;