[Tutorial] Thư viện STL trong C++ : Vector

Giới thiệu về vector:

Vector có thể xem như là một mảng động (dynamic array): một mảng có thể thay đổi kích thước.

Giống như mảng, vector sử dụng các vùng nhớ liên tiếp để lưu trữ các phần tử, đều đó có nghĩa là các phần tử có thể sử dụng con trỏ để truy cập các phần tử. Tuy nhiên, không giống như mảng thông thước, kích thước của vector có thể thay đổi một cách linh hoạt.

Khai báo vector:

Để sử dụng vector, đầu tiên ta cần khai báo thư viện vector:

Để hiểu rõ cách khai báo vector, ta xem các ví dụ bên dưới.

Vector 1 chiều:

Từ ví dự đến  ví dụ 4 là cách khai báo thường dùng cho vector 1 chiều.

Ví dụ 1: Khai báo vector 1 chiều, rỗng, dữ liệu kiểu int có tên là firstVector:

Ví dụ 2: Tạo vector có 4 phần tử int và 4 phần tử này đều có giá trị 100 có tên là secondVector:

Ví dụ 3: Khai báo một vector kiểu int có tên là thirdVector sao chép từ đầu đến cuối secondVector:

Lưu ý: begin(), end() là các phương thức cung cấp sẵn của đối tượng vector dùng để truy xuất phần tử đấu tiên và cuối cùng của vector.

Ví dụ 4: Tạo vector kiểu int tên là fourVector và sao chép tất cả phần tử  thirdVector

Nhận xét:

Khai báo ở Ví dụ 4 có chức năng tương tự như ví dụ 3 nhưng đơn giản hơn.

Vector 2 chiều:

Ví dụ 5:  Tạo vector 2 chiều, phần tử rỗng, kiểu int có tên là v:

Ví dụ 6:  khai báo vector kích thước 5×10 :

Ví dụ 7: Khai báo  vector 2 chiều, có 5 vector 1 chiều đều rỗng:

Ví dụ 8: Khai báo vector 5×10 với các phần tử khởi tạo giá trị là đều là 1

Lưu ý:  2 dấu “ngoặc” không được viết liền nhau.

Ví dụ 9: Khai báo vector 2 chiều SAI

Các phương thức thành viên:

Đầu tiên ta cần hiều rằng: vector là một đối tượng (Object) được xây dựng sẵn. Do đó, các hàm thành viên của vector tất nhiên được gọi là phương thức (method). Vậy, để truy xuất các phương thức của vector, ta dùng cấu trúc:

Object.Method(parameter, …………)

Ghi chú: parameter: tham số.

Ví dụ: sử dụng phương thức push_back(paramether) của vector để thêm vào cuối vector:

Trước khi đi vào các ví dụ cụ thể của các phương thức của vector, ta xem sơ lượt về tên và chức năng của chúng:

Capacity:
size() Trả về số lượng phần tử
empty() Trả về true(1) nếu vector rỗng, ngược lại là false (0)
Element access:
operator  [int i] Truy cập giá trị phần tử thứ i của vector, tương tự như đối mảng thông thường
at(int i) Truy cập phần tử thứ i của vector
front() Truy cập phần tử đầu tiên của vetor
back() Truy cập phần tử cuối cùng của vector
Modifier:
push_back(const x) Thêm phần tử có giá trị x vào cuối vector
pop_back() Loại bỏ phần tử cuối ra khỏi vector
insert (iterator positon,const x) 

insert (iterator positon,int n, const x)

 

insert (iterator positon,iterator a, itertator b)

 

Chèn phần tử có giá trị x vào trước vị trí position.Chèn n phần tử có giá trị x vào trước vị trí position.

Chèn vào trước vị trí position tất cả các phần tử trong nửa khoảng [a,b) của một vector khác.

erase (iterator position) 

erase (iterator first, iterator last)

 

Xóa phần tử ở vị trí position 

Xóa tất cả các phần tử trong nửa khoảng [first,last), tức là từ phần tử thứ first đến phần tử thứ (last-1)

swap(vector v) Hoán đổi các phần tử của vector hiện hành và vector v
clear() Xóa vector

Capacity:

size():

Trả về số lượng phần tử của vector.

Ví dụ: Tạo một vector có kích thước là 10 và in ra số lượng phần tử của vector này.

Ta có thể dùng phương thức size() để truy xuất các phần tử của vector khi chưa biết kích thước của vector, ví dụ:

empty()

Trả về true(1) nếu vector rỗng, ngược lại là false (0)

Ví dụ: Kiểm tra vector có rỗng không và  in ra thông báo tương ứng.

Element access:

operator [ ] :

Sử dụng [ ] để truy cập phần tử tương tự như đối với mảng thông thường.

Ví dụ: Tạo một vector 10 phần tử với giá các phần tử  lần lượt là  từ 0 đến 9. In ra các phần tử của vector

Lưu ý: Ở chương trình trên, trong vòng lặp đầu tiên, ta không thể dùng myVector[i] =i thay cho lệnh myVector.push_back(i) vì ta khai báo bằng câu lệnh:

thì chưa xác định kích thước của vector.

Nếu ta muốn dùng myVector[i] =i thay cho lệnh myVector.push_back(i) thì ta phải thay đổi cách khai báo vector. Ta có thể thay đổi:

thành:

Vậy, chương trình sau khi thay đổi như phía dưới:

at (int i)

Truy cập phần tử thứ i trong vector.

Phương thức at() có chức năng tương tự như operator [] .

Ví dụ: Tạo vector có 10 phần tử bao gồm 0, 10, 20, 30 , 40, 50, 60, 70, 80, 90. Sau đó, sử dụng phương thức at() để in giá trị các phần tử.

font()

Truy xuất phần tử đầu tiên của vector. Truy xuất ở đây bao gồm in hoặc chỉnh sửa giá trị.

Ví dụ: Tạo vector có 5 phần tử có giá trị lần lượt là a,b,c,d,e. Thay đổi phẩn tử đầu tiền thành ‘A’ và in ra kết quả.

back()

Truy xuất phần tử cuối cùng của vector. Truy xuất ở đây bao gồm in hoặc chỉnh sửa giá trị.

Ví dụ: Tạo vector có 5 phần tử có giá trị lần lượt là  A,B,C,D,E. Thay đổi phẩn tử cuối cùng thành ‘e’ và in ra kết quả.

Modifier

push_back(const x)

Thêm phần tử có giá trị x vào cuối vector.

Phương thức push_back(x) thường dùng để khởi tạo vector một cách “động”, có nghĩa là kích thước vector chưa xác định trước.

Ví dụ: Viết chương trình cho người dùng nhập vào kích thước vector và nhập vào giá trị các phần tử. In ra các phần tử trong vector.

pop_back()

Loại bỏ phần tử cuối ra khỏi vector.

Ví dụ: Viết chương trình cho người dùng nhập vào kích thước vector và nhập vào giá trị các phần tử. Sau đó, loại bỏ đi một nửa các phần tử ở cuối vector.  In ra các phần tử trong vector.

Lưu ý:

Việc dùng pop_back() chỉ dịch chuyển con trỏ end() về phía trước. Điều này có nghĩa là giá trị của các phần tử cuối vector sau khi dùng lệnh pop_back() vẫn còn lưu trữ. Cụ thể, trong chương trình trên, ở vòng lặp for cuối cùng, nếu ta thay đổi:

thành :

thì ta thấy giá trị các phần tử ta nhập ban đâu vẫn còn lưu lại.

insert

Insert có thể dùng với 3 cách sau:

insert (iterator positon,const x): Chèn phần tử có giá trị x vào trước vị trí position.

insert (iterator positon,int n, const x): Chèn n phần tử có giá trị x vào trước vị trí position.

insert (iterator positon,iterator a, itertator b): Chèn vào trước vị trí position của vector hiện hành tất cả các phần tử trong nửa khoảng [a,b) của một vector khác.

Ví dụ 1: Tạo vector có 5 phần tử đều có giá trị là 100. Chèn phần tử có giá trị 200 vào vị trí thứ 2 của vector.

Ví dụ 2: Tạo vector có 5 phần tử đều có giá trị là 100. Chèn 2 phần tử có giá trị 200 vào vị trí đầu tiên của vector.

Ví dụ 3: Tạo vector thứ nhất có 5 phần tử đều có giá trị là 100. Tạo vector thứ hai có 3 phần tử đều có giá trị là 200. Chèn tất cả các phần tử của vector thứ hai vào vị trí thứ 2 của vector thứ nhất.

Lưu ý: Ngoài việc chèn vector này vào vector khác, ta có thể chèn một mảng các phần tử vào vector.

Ví dụ 4: tạo một vector có 5 phần tử đều có giá trị là 100. Tạo một mảng int có 3 phần tử lần lượt là 200, 300, 400. Chèn 2 phần tử đầu của mảng vào đầu vector.

 erase

Phương thức erase có 2 cách dùng:

erase (iterator position): Xóa phần tử ở vị trị position

erase (iterator first, iterator last): Xóa tất cả các phần tử trong nửa khoảng [frist,last), có nghĩa là từ phẩn tử thứ first đến phần tử thứ (last-1).

Ví dụ 1: Tạo một vector có 10 phần tử có giá trị từ 1 đến 10. Xóa phần tử thứ 6 và in ra các phần tử còn lại.

Ví dụ 2: Tạo một vector có 10 phần tử có giá trị từ 1 đến 10. Xóa  3 phần tử ở đầu vector.

 swap(vector v)

Hoán đổi vector v với vector hiện hành.

Ví dụ: Cho hai vector, vector thứ nhất có 5 phần tử đều là số 1, vector thứ hai có 5 phần tử đều là số 2. Hoán đổi hai vector trên và in ra các phần tử của mỗi vector.

 clear()

Xóa hoàn toàn một vector.

Ví dụ: Tạo một vector có 5 phần tử đều có giá trị là 5. In kích thước của vector trước và sau khi dùng phương thức clear()

Lưu ý: phương thức clear() chỉ làm làm cho kích thước của vector về 0. Tuy nhiên, giá trị mà vector lưu trữ vẫn còn. Cụ thể, trong ví dụ trên, nếu ta thêm vào cuối chương trình câu lệnh:

thì ta thấy kết quả vẫn in ra được các giá trị các phần tử của vector.

Share
Share