Trong C++, mảng và vector là hai cấu trúc dữ liệu phổ biến được sử dụng để lưu trữ và quản lý các phần tử có cùng kiểu dữ liệu. Tuy nhiên, chúng có những đặc điểm và cách sử dụng khác nhau. Dưới đây là phân tích chi tiết về cả hai:
Mảng (Array)
Mảng là một cấu trúc dữ liệu tĩnh, có kích thước cố định và được cấp phát bộ nhớ ngay khi khai báo.
Đặc điểm của mảng:
- Kích thước cố định: Kích thước của mảng phải được xác định trước khi biên dịch và không thể thay đổi trong quá trình chạy chương trình.
- Lưu trữ liên tục: Các phần tử của mảng được lưu trữ liên tiếp trong bộ nhớ, điều này giúp truy cập nhanh chóng thông qua chỉ số.
- Chỉ số bắt đầu từ 0: Chỉ số của mảng luôn bắt đầu từ
0
và kết thúc tạikích thước - 1
.
Cách khai báo mảng:
// Khai báo mảng với kích thước cố định
int arr[5]; // Mảng chứa 5 phần tử kiểu int
// Khởi tạo mảng với giá trị ban đầu
int arr2[5] = {1, 2, 3, 4, 5};
// Khởi tạo mảng mà không cần chỉ định kích thước
int arr3[] = {10, 20, 30}; // Kích thước tự động là 3
Truy cập và thao tác với mảng:
#include <iostream>
using namespace std;
int main() {
int arr[5] = {10, 20, 30, 40, 50};
// Truy cập phần tử
cout << "Phần tử thứ 2: " << arr[1] << endl;
// Thay đổi giá trị
arr[2] = 100;
cout << "Phần tử thứ 3 sau khi thay đổi: " << arr[2] << endl;
// Duyệt mảng
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
return 0;
}
Ưu điểm và nhược điểm của mảng:
- Ưu điểm:
- Truy cập nhanh chóng nhờ lưu trữ liên tục.
- Đơn giản và dễ sử dụng.
- Nhược điểm:
- Kích thước cố định, không linh hoạt.
- Không có sẵn các phương thức hỗ trợ như thêm/xóa phần tử.
Vector
Vector là một lớp thuộc thư viện chuẩn STL (Standard Template Library) của C++. Nó là một mảng động, có thể thay đổi kích thước trong quá trình chạy chương trình.
Đặc điểm của vector:
- Kích thước động: Vector có thể tự động mở rộng hoặc thu hẹp kích thước khi thêm hoặc xóa phần tử.
- Lưu trữ liên tục: Giống như mảng, các phần tử của vector cũng được lưu trữ liên tiếp trong bộ nhớ.
- Hỗ trợ nhiều phương thức: Vector cung cấp nhiều phương thức hữu ích như thêm, xóa, chèn phần tử, v.v.
Cách khai báo vector:
#include <vector> // Cần include thư viện vector
// Khai báo vector rỗng
std::vector<int> vec;
// Khai báo vector với kích thước ban đầu
std::vector<int> vec2(5); // Vector chứa 5 phần tử, giá trị mặc định là 0
// Khai báo vector với giá trị khởi tạo
std::vector<int> vec3 = {1, 2, 3, 4, 5};
Các phương thức cơ bản của vector:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {10, 20, 30};
// Thêm phần tử vào cuối vector
vec.push_back(40);
// Xóa phần tử cuối cùng
vec.pop_back();
// Lấy kích thước hiện tại
cout << "Kích thước: " << vec.size() << endl;
// Kiểm tra vector có rỗng hay không
if (vec.empty()) {
cout << "Vector rỗng" << endl;
} else {
cout << "Vector không rỗng" << endl;
}
// Truy cập phần tử
cout << "Phần tử thứ 2: " << vec[1] << endl;
// Duyệt vector
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;
// Sử dụng iterator để duyệt
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " ";
}
return 0;
}
Ưu điểm và nhược điểm của vector:
- Ưu điểm:
- Kích thước linh hoạt, có thể thay đổi trong quá trình chạy.
- Hỗ trợ nhiều phương thức tiện ích như
push_back
,pop_back
,insert
, v.v. - An toàn hơn mảng vì có kiểm tra giới hạn chỉ số (khi sử dụng
at()
).
- Nhược điểm:
- Chi phí bộ nhớ cao hơn do cần quản lý kích thước động.
- Hiệu suất thấp hơn so với mảng khi thực hiện các thao tác thêm/xóa phần tử ở đầu hoặc giữa vector.
So sánh mảng và vector:
Tiêu chí | Mảng (Array) | Vector |
---|---|---|
Kích thước | Cố định | Động |
Lưu trữ | Liên tục trong bộ nhớ | Liên tục trong bộ nhớ |
Thêm/Xóa phần tử | Không hỗ trợ | Hỗ trợ (push_back ,pop_back , …) |
Hiệu suất | Nhanh hơn khi truy cập | Chậm hơn khi thêm/xóa phần tử |
An toàn | Không kiểm tra giới hạn chỉ số | Có kiểm tra giới hạn chỉ số (vớiat ) |
Sử dụng thư viện | Không cần thư viện | Cần#include <vector> |
Kết luận:
- Mảng phù hợp khi bạn biết trước số lượng phần tử và không cần thay đổi kích thước trong quá trình chạy.
- Vector là lựa chọn tốt hơn khi bạn cần một cấu trúc dữ liệu linh hoạt, có thể thay đổi kích thước và hỗ trợ nhiều thao tác phức tạp.
Tùy thuộc vào yêu cầu cụ thể của bài toán, bạn có thể chọn sử dụng mảng hoặc vector để tối ưu hiệu suất và tính tiện lợi.