Vector Vs Array: Nên Dùng Gì?

Vector Vs Array: Nên Dùng Gì?

Trước khi đọc bài viết các bạn nên hiểu cách cài đặt vector để chúng ta có cái nhìn tổng quan hơn trong bài viết cách tạo vevtor trong C++
 . Trong bài viết này mình tập trung so sánh các đặc điểm cơ bản nhất của vector và array gồm có: khai báo, kích thước, thêm, xóa phần tử..

1. Khai báo và kích thước

Array:

  • Là một mảng tĩnh gồm các phần tử liên tiếp trong bộ nhớ nên khi khai báo ta phải khai báo cho nó một kích thước cố định với cú pháp như sau: "kiểu dữ liệu" "tên mảng"[số lượng phần t];
  • Ví dụ: int a[100]; khai báo mảng số nguyên tên là a có 100 phần tử
  • Cách nhập giá trị cho phần tử thứ i là cin>>a[i];
  • Cách in giá trị phần tử thứ i ra màn hình là cout<<a[i];

Vector:

  • Bản chất là một mảng động cũng có các phần tử nằm liên tiếp nhau trong bộ nhớ nhưng có thể thay đổi kích thước bất kì.
  • Do chúng ta sử dụng lớp vector có sẵn trong thư viện chuẩn nên muốn sử dụng chúng ta phải khai báo thư viện #include <vector>
  • Có 2 cách khởi tạo vector là: 
    • vector<"kiểu dữ liệu"> "tên vector";
    • vector<"kiểu dữ liệu"> "tên vector"(số lượng phần tử);
  • Nhập xuất vector giống với nhập xuất mảng nhưng ta có thêm hàm bổ trợ để thêm giá trị vào cuối vector trong trường hợp chưa biết rõ vector có bao nhiêu phần tử hoặc trong lúc thực thi ta muốn thêm giá trị vào là: "tên vector".push_back(giá trị);

Qua trên ta cũng có thể thấy rõ ưu điểm vượt trội của vector là chúng có thể tùy biến trong bài, không gò bó về kích thước điều nãy dẫn tới tiết kiệm bộ nhớ. Giả sử như ta khai báo một mảng gồm có 1.000.000 phần tử nhưng ta chỉ dùng có 1000 phần tử thì điều này rất là lãng phí; hay ta khai báo mảng gồm có 1000 phần tử nhưng thực tế ta phải dùng nhiều hơn điều này cũng dẫn tới lỗi khi thêm phần tử vào; Còn đối với vector ta chỉ cần khai báo tên vector và thêm các phần tử bằng phương thức "tên vector".push_back(giá trị); thì mọi vấn đề trên đều được giải quyết điều đó dẫn tới chúng ta tiết kiệm được nhiều bộ nhớ dư thừa.

2. Thêm phần tử

Array:

Đối với mảng tĩnh khi thêm phần tử ta cần phải viết riêng 1 hàm thêm phần tử vào mảng như sau:

void themPT(int &n, int a[], int pos, int x)
{
	for(int i = n; i > pos; i--)
	{
        a[i] = a[i-1];
    }
    n++;
    a[pos] = x;
}

Ý tưởng là ta dịch lần lượt các phần tử từ n-1 tới vị trí cần thêm sang bên phải 1 đơn vị, để ta có một ô trống pos chèn giá trị x cần thêm vào

Vector:

Do vector là một thư viện chuẩn trong C++, nên khi thêm phần tử vào vector ta chỉ cần nhớ cú pháp của phương thức rồi gọi ra với cú pháp như sau:

  • myvector.insert(pos, x); thêm x vào vector tại vị trí pos
  • myvector.insert(pos, k, x); thêm k phần tử x vào vector từ vị trí pos
  • myvector.insert(pos, x.begin(), x.end()); thêm vector x vào vector myvector từ vị trí pos
  • myvector.insert(pos, array, array + k); thêm k phần tử trong mảng array vào vector từ vị trí pos
  • Ở đây ta lưu ý phương thức begin() là trả về vị trí đầu của vector và end() là trả về  vị trí cuối của vector

Qua phần thêm phần tử ta có thể thấy rằng nếu mảng (array) đã dùng hết bộ nhớ thì khi thêm sẽ xảy ra lỗi. Còn đối với vector thì không bởi vì vector là một mảng động hay nói cách khác vector được tạo bởi mảng con trỏ vì thế khi thêm phần tử vào vector nó sẽ kiểm tra mảng đó có còn chỗ trống không, nếu không thì nó sẽ cấp phát thêm bộ nhớ cho một mảng mới rồi copy mảng cũ qua mảng mới rồi xóa bộ nhớ cũ đi rồi tiến hành thêm phần tử x vào vector tại vị trí pos. Và đồng thời trong thư viện vector chứa nhiều hàm insert có tham số truyền vào khác nhau nên chúng ta có thể sử dụng linh hoạt khi thêm các phần tử trong nhiều trường hợp như trên mình đã liệt kê => Không mất công viết nhiều hàm đối với mảng thông thường.

3. Xóa phần tử

Array:

Tương tự như thêm phần tử, thì đối với mảng khi xóa phần tử tại vị trí pos ta cũng phải tự viết hàm xóa

void xoaPT(int &n, int a[], int pos)
{
	for(int i = pos; i < n - 1; i++)
	{
        a[i] = a[i+1];
	}
	n--;
}

Ý tưởng là ta dịch lần lượt các phần tử từ vị trí pos+1 tới cuối mảng qua bên trái 1 đơn vị rồi giảm số lượng phần tử n đi 1 đơn vị

Vector:

Tương tự như thêm phần tử, thì vector có các hàm xóa phần tử với cú pháp như sau:

  • myvector.erase(pos); xóa phần tử tại vị trí pos trong vector;
  • myvector.erase(myvector.begin()+i; myvector.begin()+k); xóa các phần tử từ vị trí i cho tới vị trí k
  • myvector.pop_back(); xóa phần tử cuối cùng của vector

Qua đây chúng ta có thể thấy khi xử dụng vector ta có thể xóa được nhiều phần tử cùng lúc mà không cần phải gọi nhiều hàm xóa như mảng tĩnh ta vẫn hay dùng khi mới học

Tổng Kết

Qua bài viết trên chắc hẳn chúng ta cũng có thể biết được mình nên chọn cái nào khi lập trình rồi đúng không? Theo cá nhân mình thì mình sẽ chọn vector bởi lẽ vector nó là một mảng con trỏ có kích thước linh hoạt giải quyết được các vấn đề thừa, thiếu bộ nhớ khi chạy, có nhiều hàm bổ trợ (ví dụ như hàm sort để sắp xếp, hàm erase để xóa, hàm insert để thêm, hàm find để tìm kiếm,...) tiết kiệm thời gian code trong các cuộc thi lập trình hay project.

Cảm ơn các bạn đã đọc!! Mong các bạn ủng hộ mình các bài đọc kế tiếp nhé!!