Cấu trúc mảng và vector trong C++

Trong C++, mảng 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ại kí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ướcCố đị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ấtNhanh hơn khi truy cậpChậm hơn khi thêm/xóa phần tử
An toànKhô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ệnKhông cần thư việnCầ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.