[STL] Giới thiệu về std::vector trong lập trình C++

Vector

std::vector là “sequence containers” trong STL C++ và được định nghĩa trong header <vector>

template < class T, class Alloc = allocator<T> > class vector;

Ví dụ:

    //Định nghĩa empty vector
    vector<int> v1;

    //Định nghĩa vector có 5 phần tử có giá trị 30
    vector<int> v2(5, 30);

    //Định nghĩa vector có nhiều phần trong khoảng [begin, end]
    vector<int> v3(v2.begin(), v2.end());

    //Định nghĩa vector copy từ v3
    vector<int> v4(v3);

Vector là mảng động có các phần tử sắp xếp tuần tự tuyến tính, ta có thế truy cập đến từng phần tử của vector thông qua chỉ số của phần tử đó.

Khi ta thêm phần tử mới vào vector, kích thước của vector tăng lên, trình biên dich sẽ cấp phát 1 mảng các phần tử mới cho vector và move tất cả các phẩn tử cũ sang.

Viêc cấp phát bộ nhớ mới và move các phần tử sang sẽ mất thời gian xử lý. Vì thế vector có thể thêm 1 vùng nhớ mở rộng gọi là capacity, đế vector có thể thêm 1 số phần tử mà không phải cấp phát lại bộ nhớ.

Tùy vào từng trình biên dịch mà capacity có thể lớn hơn hoặc bằng kích thước (size) thực tế của vector. Khi vector thêm phần tử mà kích thước vẫn nhỏ hơn capacity thì trình biên dịch sẽ không phải cấp phát lại bộ nhớ cho vector.

Các đặc điểm của vector

  • Các phần tử của vector được sắp xếp tuần tự tuyến tính, ta có thể truy cập đến các phần tử của vector thông qua chỉ số của phần tử đó.
  • Cho phép truy cập trực tiếp vào phần tử nào của vector, có thể thêm, sửa, xóa các phần tử.
  • Vector Sử dụng một đối tượng để cấp phát bộ nhớ tự động cho quá trình lưu trữ. Tức là kích thước của vector sẽ tự động thay đổi khi ta thêm hoặc bớt phần tử.

Các hàm của class vector

Hàm về Iterator

Tên hàmChức năng
beginTrả về iterator trỏ vào phần tử đầu tiên
endTrả về iterator trỏ vào phần tử cuối cùng
cbeginTrả về const_iterator trỏ vào phần tử đầu tiên
cendTrả về const_iterator trỏ vào phần tử cuối cùng
rbeginTrả về iterator trỏ vào phần tử đầu tiên của containers bị đảo ngược
rendTrả về iterator trỏ vào phần tử cuối cùng của containers bị đảo ngược
rcbeginTrả về const_iterator trỏ vào phần tử đầu tiên của containers bị đảo ngược
rcendTrả về const_iterator trỏ vào phần tử cuối cùng của containers bị đảo ngược

Nếu bạn thấy khó hiểu về begin/rbegin có thể xem lại bài viết: Giới thiệu về array trong C++

Hàm về capacity

Tên hàmChức năng
sizeTrả về kích thước ( số phần tử ) của vector
max_sizeTrả về số phần tử lớn nhất mà vector có thể lưu trữ.
resizeThay đổi kích thước ( số phần tử ) của vector
emptyKiểm tra xem vector có rỗng không
capacityTrả về kích thước của vector được phân bổ, thường bằng hoặc lớn hơn size
reserverThay đổi capacity của vector

Hàm về truy cập các phần tử.

Tên hàmChức năng
operator[]Truy cập phần từ của mảng theo index arr[i].
atTruy cập phần tử của mảng theo index arr.at(i).
frontTruy cập phần tử đầu tiên của mảng.
endTruy cập phần tử cuối cùng của mảng.
dataTrả về con trỏ đại diện cho mảng.

Hàm modify data

Tên hàmChức năng
assignGán giá trị cho vector, replace tất cả các phần tử, modify size.
push_backThêm phần tử vào cuối vector
pop_backXoá phần tử cuối vector
insertThêm một hoăc nhiều phần tử vào vector
eraseXoá phần tử của vector
clearXoá toàn bộ vector
swapChuyển dữ liệu hai vector có cùng kiểu dữ liệu.

Ví dụ

#include <iostream>

#include <vector>

using namespace std;

int main()

{

	//Định nghĩa vector
	vector<int> v1 = {1, 2, 3, 4, 5};

	//Thêm phần tử vào cuối vector
	v1.push_back(20);

	//Hiển thị các giá trị của vector
	
	cout << "V1 = ";
	
	for (auto it = v1.begin(); it != v1.end(); it++)
	
	{
	
		cout << *it << "  ";
	
	}

	//Đảo ngược V1

	cout << endl << "Reverse V1 = ";

	for (auto it = v1.rbegin(); it != v1.rend(); it++)
	
	{
	
		cout << *it << "  ";
	
	}
	
	//Xóa phần tử vị trí thứ 4
	v1.erase(v1.begin() + 3);

	cout << endl << "Sau khi xoa \nV1 = ";

	for (auto it = v1.begin(); it != v1.end(); it++)

	{

		cout << *it << "  ";

	}
	
	return 0;

}

Kết quả :

V1 = 1 2 3 4 5 20

Resever V1 = 20 5 4 3 2 1

Sau khi xoa

V1 = 1 2 3 5 20

 

Was this article helpful?

Leave A Comment?