Vector trong C++

Giới thiệu

Trong ngôn ngữ lập trình C++, vector là một kiểu dữ liệu tương tự như mảng động, tuy nhiên, nó cung cấp nhiều tính năng hơn và được sử dụng rộng rãi trong lập trình.

Vector là một mảng động có thể tăng hoặc giảm kích thước một cách linh hoạt tùy vào nhu cầu của chương trình. Nó cũng cung cấp các phương thức để thêm, xóa, sắp xếp các phần tử một cách dễ dàng và đảm bảo hiệu suất tốt hơn so với mảng truyền thống.

Một số tính năng quan trọng của vector trong C++:

  • Có thể lưu trữ các kiểu dữ liệu khác nhau.
  • Có thể tăng hoặc giảm kích thước của vector theo nhu cầu.
  • Có thể thêm, xóa và sắp xếp các phần tử của vector một cách dễ dàng.
  • Có thể truy cập các phần tử của vector thông qua vị trí hoặc iterator.
  • Có khả năng tương thích với các thuật toán chuẩn của STL (Standard Template Library).

Vector trong C++ rất quan trọng và được sử dụng rộng rãi trong lập trình. Nó là một công cụ cần thiết để quản lý các tập hợp dữ liệu động và giúp tối ưu hóa việc lưu trữ và xử lý dữ liệu.

Khai báo và sử dụng vector

Để sử dụng vector trong C++, trước hết bạn cần phải khai báo vector và thêm thư viện chứa vector vào chương trình của mình. Để làm điều này, hãy sử dụng cú pháp sau:

#include <vector>
using namespace std;

int main()
{
    vector<int> myvector;
    // Code xử lý vector
    return 0;
}

Trong đó, vector là kiểu dữ liệu của vector, myvector là tên của vector và int là kiểu dữ liệu của các phần tử trong vector.

Sau khi khai báo vector, bạn có thể sử dụng các phương thức để thêm, xóa và truy cập các phần tử trong vector. Dưới đây là một số phương thức cơ bản của vector:

  1. Thêm phần tử vào vector:
  • push_back(): Thêm một phần tử vào cuối vector.
  • insert(): Thêm một phần tử vào bất kỳ vị trí nào trong vector.
  1. Xóa phần tử khỏi vector:
  • pop_back(): Xóa phần tử cuối cùng khỏi vector.
  • erase(): Xóa một phần tử tại vị trí được chỉ định hoặc xóa một khoảng phần tử được chỉ định trong vector.
  1. Truy cập phần tử trong vector:
  • operator[]: Truy cập phần tử trong vector bằng cách sử dụng vị trí của nó.
  • at(): Truy cập phần tử trong vector bằng cách sử dụng vị trí của nó, tuy nhiên phương thức này sẽ kiểm tra xem vị trí truy cập có hợp lệ hay không.
  • front(): Truy cập phần tử đầu tiên trong vector.
  • back(): Truy cập phần tử cuối cùng trong vector.
  1. Sử dụng iterator để truy cập các phần tử của vector:
  • begin(): Lấy iterator của phần tử đầu tiên trong vector.
  • end(): Lấy iterator của phần tử sau phần tử cuối cùng trong vector.

Dưới đây là một ví dụ đơn giản về việc sử dụng vector để lưu trữ và truy cập các phần tử:




#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> myvector; // Khai báo vector
    myvector.push_back(10); // Thêm phần tử vào vector
    myvector.push_back(20);
    myvector.push_back(30);
    
    // Truy cập phần tử trong vector
    cout << "Phan tu dau tien: " << myvector.front() << endl;
    cout << "Phan tu cuoi cung: " << myvector.back() << endl;
    cout << "Phan tu tai vi tri thu 1: " << myvector.at(1) << endl;

    // Duyệt vector bằng iterator
    cout << "Cac phan tu trong vector: ";
    for (vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
        cout << *it << " ";
    cout << endl;

    // Xóa phần tử đầu tiên và cuối cùng
    myvector.erase(myvector.begin());
    myvector.pop_back();

    // In ra các phần tử còn lại trong vector
    cout << "Cac phan tu trong vector sau khi xoa: ";
    for (int i = 0; i < myvector.size(); ++i)
        cout << myvector[i] << " ";
    cout << endl;

    return 0;
}

Kết quả:

Phan tu dau tien: 10
Phan tu cuoi cung: 30
Phan tu tai vi tri thu 1: 20
Cac phan tu trong vector: 10 20 30 
Cac phan tu trong vector sau khi xoa: 20 

Trong ví dụ này, chúng ta khai báo vector myvector và thêm ba phần tử vào đó bằng cách sử dụng phương thức push_back(). Sau đó, chúng ta truy cập phần tử đầu tiên, phần tử cuối cùng và phần tử thứ hai của vector bằng các phương thức front(), back()at(). Chúng ta cũng duyệt qua các phần tử của vector bằng cách sử dụng iterator và in ra các phần tử đó.

Tiếp theo, chúng ta xóa phần tử đầu tiên của vector bằng phương thức erase() và phần tử cuối cùng bằng phương thức pop_back(), sau đó in ra các phần tử còn lại trong vector bằng cách duyệt qua vector và sử dụng phương thức size() để xác định số lượng phần tử trong vector.

Các phương thức của vector

Trong C++, lớp Vector được định nghĩa trong thư viện chuẩn “vector”. Dưới đây là một số phương thức của lớp Vector trong C++:

  1. Phương thức thêm, xóa và chèn phần tử:
  • push_back(): thêm một phần tử vào cuối vector.
  • pop_back(): xóa phần tử cuối cùng khỏi vector.
  • insert(): chèn một phần tử vào vị trí bất kỳ của vector.
  • erase(): xóa một phần tử từ vector.
  • clear(): xóa tất cả các phần tử của vector.
  1. Phương thức lấy thông tin và tìm kiếm phần tử:
  • size(): trả về số lượng phần tử trong vector.
  • empty(): kiểm tra xem vector có rỗng hay không.
  • front(): trả về phần tử đầu tiên của vector.
  • back(): trả về phần tử cuối cùng của vector.
  • at(): trả về phần tử tại vị trí được chỉ định trong vector.
  • find(): tìm kiếm phần tử đầu tiên có giá trị xác định trong vector.
  1. Phương thức sắp xếp và thay đổi kích thước:
  • sort(): sắp xếp các phần tử của vector.
  • resize(): thay đổi kích thước của vector.
  1. Phương thức khác:
  • swap(): đổi chỗ các phần tử của hai vector.
  • reserve(): cấp phát bộ nhớ cho vector.

Chú ý rằng, lớp Vector còn có các phương thức khác nữa, tuy nhiên các phương thức trên là những phương thức cơ bản và thường được sử dụng trong các ứng dụng thực tế.

Các toán tử của Vector

Trong C++, lớp Vector được định nghĩa trong thư viện chuẩn “vector”. Nó cung cấp một số toán tử để thực hiện các phép toán trên vector. Dưới đây là một số toán tử của lớp Vector trong C++:

  1. Toán tử truy cập:
  • operator[]: truy cập phần tử của vector bằng chỉ số.
  • at(): truy cập phần tử của vector bằng chỉ số, tương tự như operator[], nhưng nó kiểm tra giới hạn và ném ra ngoại lệ nếu chỉ số vượt quá kích thước của vector.
  1. Toán tử so sánh:
  • operator==(): so sánh hai vector xem chúng có bằng nhau hay không.
  • operator!=(): so sánh hai vector xem chúng có khác nhau hay không.
  1. Toán tử toán học:
  • operator+(): cộng hai vector với nhau.
  • operator-(): trừ hai vector với nhau.
  • operator*(): nhân vector với một số thực.
  • operator/(): chia vector cho một số thực.
  1. Toán tử gán:
  • operator=(): gán một vector cho một vector khác.

Một số lưu ý quan trọng khi sử dụng các toán tử của lớp Vector trong C++:

  1. Toán tử [] chỉ nên được sử dụng để truy cập phần tử trong vector. Nếu bạn cố gắng truy cập phần tử bên ngoài phạm vi vector bằng toán tử này, chương trình có thể bị lỗi.

  2. Toán tử +, -, *, và / chỉ hoạt động khi các vector có cùng kích thước. Nếu bạn cố gắng thực hiện các phép toán này với các vector có kích thước khác nhau, chương trình sẽ báo lỗi.

  3. Khi sử dụng toán tử == và != để so sánh hai vector, vector phải có cùng kích thước và giá trị của tất cả các phần tử trong vector phải bằng nhau.

  4. Khi sử dụng toán tử << và >> để nhập và xuất vector, cần đảm bảo rằng vector đang được nhập hoặc xuất theo định dạng chính xác. Nếu không, chương trình sẽ báo lỗi hoặc đưa ra kết quả không mong muốn.

  5. Các toán tử của lớp Vector được sử dụng để thực hiện các thao tác cơ bản với vector như truy cập, thêm và xóa phần tử, sắp xếp và tìm kiếm. Để thực hiện các thao tác phức tạp hơn như ghép nối, tìm kiếm nâng cao hoặc tính toán đại số tuyến tính, bạn có thể sử dụng các thư viện và công cụ khác như Boost hoặc Eigen.

Vector hai chiều

Lớp vector trong C++ cũng hỗ trợ mảng hai chiều thông qua việc sử dụng vector lồng nhau. Ví dụ dưới đây cho thấy cách khai báo và sử dụng một vector hai chiều:

#include <vector>
#include <iostream>

int main() {
    // Khai báo một vector hai chiều với kích thước 3x4
    std::vector<std::vector<int>> v(3, std::vector<int>(4));

    // Gán giá trị cho các phần tử của vector
    v[0][0] = 1;
    v[0][1] = 2;
    v[0][2] = 3;
    v[0][3] = 4;

    v[1][0] = 5;
    v[1][1] = 6;
    v[1][2] = 7;
    v[1][3] = 8;

    v[2][0] = 9;
    v[2][1] = 10;
    v[2][2] = 11;
    v[2][3] = 12;

    // In ra các phần tử của vector
    for (int i = 0; i < v.size(); i++) {
        for (int j = 0; j < v[i].size(); j++) {
            std::cout << v[i][j] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

Một số ví dụ về Vector trong C++

Để hiểu rõ hơn về vector, chúng ta cùng nhau nghiên cứu một số ví dụ về việc sử dụng vector trong C++

Ví dụ 1. Sắp xếp các phần tử theo thứ tự tăng dần

Viết một chương trình C++ để tạo một vector ngẫu nhiên và sắp xếp các phần tử của nó theo thứ tự tăng dần.

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>

using namespace std;

int main() {
    // Khai báo một vector với 10 phần tử ngẫu nhiên
    vector<int> v(10);
    random_device rd;
    mt19937 mt(rd());
    uniform_int_distribution<int> dist(1, 100);
    for (int i = 0; i < v.size(); i++) {
        v[i] = dist(mt);
    }

    // In ra vector ban đầu
    cout << "Vector ban dau: ";
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;

    // Sắp xếp vector theo thứ tự tăng dần
    sort(v.begin(), v.end());

    // In ra vector sau khi sắp xếp
    cout << "Vector sau khi sap xep: ";
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;

    return 0;
}

Trong chương trình này, chúng ta sử dụng std::random_devicestd::mt19937 để tạo một số ngẫu nhiên và sử dụng std::uniform_int_distribution để phân phối số ngẫu nhiên trong một khoảng cụ thể. Sau đó, chúng ta sử dụng vòng lặp để khởi tạo các phần tử của vector với các số ngẫu nhiên. Tiếp theo, chúng ta sử dụng hàm std::sort để sắp xếp vector và in ra vector trước và sau khi sắp xếp.

Lưu ý rằng việc sử dụng using namespace std có thể gây ra các xung đột tên trong mã nếu không cẩn thận, do đó nên tránh sử dụng chúng trong các dự án lớn hoặc trong các tệp mã chia sẻ.

Ví dụ 2. Tìm giá trị lớn nhất và nhỏ nhất trong một dãy số

Viết một chương trình C++ để nhập vào một vector chứa các số nguyên và tìm giá trị lớn nhất và nhỏ nhất trong vector.

#include <iostream>
#include <vector>
#include <limits>

int main() {
    // Khai báo một vector và số lớn nhất/nhỏ nhất
    std::vector<int> vec;
    int max_val = std::numeric_limits<int>::min();  // giá trị nhỏ nhất của kiểu int
    int min_val = std::numeric_limits<int>::max();  // giá trị lớn nhất của kiểu int

    // Nhập vào số lượng phần tử của vector
    int n;
    std::cout << "Nhap so luong phan tu cua vector: ";
    std::cin >> n;

    // Nhập vào các phần tử của vector và tìm giá trị lớn nhất/nhỏ nhất
    std::cout << "Nhap cac phan tu cua vector: ";
    for (int i = 0; i < n; i++) {
        int val;
        std::cin >> val;
        vec.push_back(val);

        if (val > max_val) {
            max_val = val;
        }

        if (val < min_val) {
            min_val = val;
        }
    }

    // In kết quả
    std::cout << "Gia tri lon nhat trong vector la: " << max_val << std::endl;
    std::cout << "Gia tri nho nhat trong vector la: " << min_val << std::endl;

    return 0;
}

Lưu ý rằng để tìm giá trị lớn nhất và nhỏ nhất của vector, chúng ta có thể duyệt qua các phần tử của vector và cập nhật giá trị lớn nhất và nhỏ nhất hiện tại nếu phần tử đó lớn hơn hoặc nhỏ hơn giá trị lớn nhất và nhỏ nhất hiện tại. Chúng ta cũng sử dụng std::numeric_limits<int>::min()std::numeric_limits<int>::max() để khởi tạo giá trị lớn nhất và nhỏ nhất ban đầu cho kiểu int.

Ví dụ 3. Tính tổng dãy số

Viết một chương trình C++ để tạo một vector chứa các số nguyên và tính tổng của tất cả các phần tử trong vector.

#include <iostream>
#include <vector>

int main() {
    // Khai báo một vector và tổng các phần tử
    std::vector<int> vec;
    int sum = 0;

    // Nhập vào số lượng phần tử của vector
    int n;
    std::cout << "Nhap so luong phan tu cua vector: ";
    std::cin >> n;

    // Nhập vào các phần tử của vector và tính tổng
    std::cout << "Nhap cac phan tu cua vector: ";
    for (int i = 0; i < n; i++) {
        int val;
        std::cin >> val;
        vec.push_back(val);
        sum += val;
    }

    // In kết quả
    std::cout << "Tong cua cac phan tu trong vector la: " << sum << std::endl;

    return 0;
}

Lưu ý rằng chúng ta sử dụng std::vector<int> để khai báo một vector chứa các số nguyên và sử dụng push_back() để thêm các phần tử vào cuối vector. Sau đó, chúng ta duyệt qua vector để tính tổng các phần tử.

Ví dụ 4. Tìm kiếm một giá trị trong vector

Viết một chương trình C++ để nhập vào một vector chứa các số nguyên và tìm kiếm một giá trị trong vector.

#include <iostream>
#include <vector>

int main() {
    // Khai báo một vector
    std::vector<int> vec;

    // Nhập vào số lượng phần tử của vector
    int n;
    std::cout << "Nhap so luong phan tu cua vector: ";
    std::cin >> n;

    // Nhập vào các phần tử của vector
    std::cout << "Nhap cac phan tu cua vector: ";
    for (int i = 0; i < n; i++) {
        int val;
        std::cin >> val;
        vec.push_back(val);
    }

    // Nhập giá trị cần tìm kiếm
    int searchVal;
    std::cout << "Nhap gia tri can tim kiem: ";
    std::cin >> searchVal;

    // Tìm kiếm giá trị trong vector và xuất ra vị trí (nếu tìm thấy)
    int pos = -1;
    for (int i = 0; i < vec.size(); i++) {
        if (vec[i] == searchVal) {
            pos = i;
            break;
        }
    }
    if (pos == -1) {
        std::cout << "Khong tim thay gia tri trong vector" << std::endl;
    } else {
        std::cout << "Gia tri " << searchVal << " duoc tim thay tai vi tri " << pos << " trong vector" << std::endl;
    }

    return 0;
}

Lưu ý rằng chúng ta sử dụng std::vector<int> để khai báo một vector chứa các số nguyên và sử dụng push_back() để thêm các phần tử vào cuối vector. Sau đó, chúng ta nhập giá trị cần tìm kiếm và duyệt qua vector để tìm kiếm giá trị đó. Nếu tìm thấy, chúng ta sẽ xuất ra vị trí của giá trị đó trong vector. Nếu không tìm thấy, chúng ta sẽ xuất ra thông báo không tìm thấy.

Ví dụ 5. Xóa một phần tử khỏi Vector

Viết một chương trình C++ để nhập vào một vector chứa các số nguyên và xóa một phần tử khỏi vector.

#include <iostream>
#include <vector>

int main() {
    // Khai báo một vector
    std::vector<int> vec;

    // Nhập các phần tử vào vector
    int n;
    std::cout << "Nhap so phan tu cua vector: ";
    std::cin >> n;

    std::cout << "Nhap cac phan tu cua vector: ";
    for (int i = 0; i < n; i++) {
        int x;
        std::cin >> x;
        vec.push_back(x);
    }

    // Hiển thị các phần tử của vector
    std::cout << "Cac phan tu trong vector la: ";
    for (int i = 0; i < vec.size(); i++) {
        std::cout << vec[i] << " ";
    }

    // Nhập vị trí phần tử muốn xóa
    int pos;
    std::cout << "\nNhap vi tri phan tu muon xoa: ";
    std::cin >> pos;

    // Kiểm tra vị trí phần tử muốn xóa có hợp lệ hay không
    if (pos < 0 || pos >= vec.size()) {
        std::cout << "Vi tri khong hop le!";
        return 0;
    }

    // Xóa phần tử tại vị trí pos
    vec.erase(vec.begin() + pos);

    // Hiển thị các phần tử của vector sau khi xóa
    std::cout << "\nCac phan tu trong vector sau khi xoa la: ";
    for (int i = 0; i < vec.size(); i++) {
        std::cout << vec[i] << " ";
    }

    return 0;
}

Ví dụ 6. Ghép nối hai vector

Viết một chương trình C++ để nhập vào hai vector chứa các số nguyên và ghép nối chúng thành một vector mới.

#include <iostream>
#include <vector>

int main() {
    // Khai báo hai vector
    std::vector<int> vec1;
    std::vector<int> vec2;

    // Nhập các phần tử vào hai vector
    int n1, n2;
    std::cout << "Nhap so phan tu cua vector 1: ";
    std::cin >> n1;

    std::cout << "Nhap cac phan tu cua vector 1: ";
    for (int i = 0; i < n1; i++) {
        int x;
        std::cin >> x;
        vec1.push_back(x);
    }

    std::cout << "Nhap so phan tu cua vector 2: ";
    std::cin >> n2;

    std::cout << "Nhap cac phan tu cua vector 2: ";
    for (int i = 0; i < n2; i++) {
        int x;
        std::cin >> x;
        vec2.push_back(x);
    }

    // Ghép nối hai vector thành một vector mới
    std::vector<int> vec3;
    vec3.reserve(n1 + n2);
    vec3.insert(vec3.end(), vec1.begin(), vec1.end());
    vec3.insert(vec3.end(), vec2.begin(), vec2.end());

    // Hiển thị các phần tử của vector mới
    std::cout << "Cac phan tu trong vector moi la: ";
    for (int i = 0; i < vec3.size(); i++) {
        std::cout << vec3[i] << " ";
    }

    return 0;
}

Ví dụ 7. Sắp xếp xâu ký tự

Viết một chương trình C++ để nhập vào một vector chứa các chuỗi và sắp xếp các chuỗi trong vector theo thứ tự bảng chữ cái.

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    // Khai báo một vector chứa các chuỗi
    std::vector<std::string> vec;

    // Nhập các chuỗi vào vector
    int n;
    std::cout << "Nhap so phan tu cua vector: ";
    std::cin >> n;

    std::cout << "Nhap cac phan tu cua vector: ";
    for (int i = 0; i < n; i++) {
        std::string str;
        std::cin >> str;
        vec.push_back(str);
    }

    // Sắp xếp các chuỗi trong vector theo thứ tự bảng chữ cái
    std::sort(vec.begin(), vec.end());

    // Hiển thị các chuỗi đã sắp xếp
    std::cout << "Cac phan tu trong vector sau khi sap xep la: ";
    for (int i = 0; i < vec.size(); i++) {
        std::cout << vec[i] << " ";
    }

    return 0;
}

Ví dụ 8. Dãy số chẵn và dãy số lẻ

Viết một chương trình C++ để nhập vào một vector chứa các số nguyên và chia vector thành hai vector con, một chứa các số chẵn và một chứa các số lẻ

#include <iostream>
#include <vector>

int main() {
    // Khai báo một vector chứa các số nguyên
    std::vector<int> vec;

    // Nhập các số nguyên vào vector
    int n;
    std::cout << "Nhap so phan tu cua vector: ";
    std::cin >> n;

    std::cout << "Nhap cac phan tu cua vector: ";
    for (int i = 0; i < n; i++) {
        int num;
        std::cin >> num;
        vec.push_back(num);
    }

    // Tạo hai vector con, một chứa các số chẵn và một chứa các số lẻ
    std::vector<int> evenVec, oddVec;
    for (int i = 0; i < vec.size(); i++) {
        if (vec[i] % 2 == 0) {
            evenVec.push_back(vec[i]);
        } else {
            oddVec.push_back(vec[i]);
        }
    }

    // Hiển thị các số chẵn và số lẻ trong các vector con
    std::cout << "Cac so chan trong vector la: ";
    for (int i = 0; i < evenVec.size(); i++) {
        std::cout << evenVec[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "Cac so le trong vector la: ";
    for (int i = 0; i < oddVec.size(); i++) {
        std::cout << oddVec[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

Ví dụ 9. Tìm số nguyên tố

Viết một chương trình C++ để nhập vào một vector chứa các số nguyên và tìm kiếm tất cả các số nguyên tố trong vector

Để tìm kiếm tất cả các số nguyên tố trong một vector, chúng ta có thể sử dụng vòng lặp để duyệt qua từng phần tử trong vector và kiểm tra xem chúng có phải là số nguyên tố hay không. Để kiểm tra số nguyên tố, ta có thể sử dụng một hàm riêng biệt để kiểm tra.

Dưới đây là chương trình C++ để nhập vào một vector chứa các số nguyên và tìm kiếm tất cả các số nguyên tố trong vector:

#include <iostream>
#include <vector>

using namespace std;

bool isPrime(int n) {
    if (n < 2) return false;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

int main() {
    vector<int> nums;
    int n;
    cout << "Enter the number of integers: ";
    cin >> n;
    cout << "Enter " << n << " integers: ";
    for (int i = 0; i < n; i++) {
        int num;
        cin >> num;
        nums.push_back(num);
    }
    cout << "Prime numbers in the vector: ";
    for (int i = 0; i < nums.size(); i++) {
        if (isPrime(nums[i])) {
            cout << nums[i] << " ";
        }
    }
    cout << endl;
    return 0;
}

Trong chương trình này, hàm isPrime được sử dụng để kiểm tra xem một số có phải là số nguyên tố hay không. Chúng ta duyệt qua từng phần tử trong vector nums bằng cách sử dụng vòng lặp for, và nếu phần tử đó là số nguyên tố, chúng ta in ra giá trị đó.

Ví dụ 10. Xóa số chẵn

Viết chương trình C++ để tạo một vector số nguyên và xóa tất cả các số chẵn khỏi vector.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    // In ra vector trước khi xóa số chẵn
    cout << "Vector ban đầu: ";
    for (int i = 0; i < numbers.size(); i++) {
        cout << numbers[i] << " ";
    }
    cout << endl;

    // Xóa tất cả các số chẵn
    for (int i = 0; i < numbers.size(); i++) {
        if (numbers[i] % 2 == 0) {
            numbers.erase(numbers.begin() + i);
            i--; // Giảm chỉ số i để đảm bảo không bỏ sót phần tử nào
        }
    }

    // In ra vector sau khi xóa số chẵn
    cout << "Vector sau khi xóa số chẵn: ";
    for (int i = 0; i < numbers.size(); i++) {
        cout << numbers[i] << " ";
    }
    cout << endl;

    return 0;
}

Ví dụ 11. Thêm phần tử vào đầu và cuối vector

Viết chương trình C++ để tạo một vector số nguyên và thêm một phần tử vào đầu và cuối vector.

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> myVector; // tạo một vector rỗng

    // thêm phần tử vào đầu vector
    myVector.insert(myVector.begin(), 10);

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

    // in ra các phần tử của vector
    for (int i = 0; i < myVector.size(); i++) {
        cout << myVector[i] << " ";
    }

    return 0;
}

Trong đó, myVector.insert(myVector.begin(), 10) dùng để thêm phần tử 10 vào đầu vector, còn myVector.push_back(20) dùng để thêm phần tử 20 vào cuối vector. Với vector myVector được tạo ban đầu rỗng, sau khi thêm các phần tử vào, vector sẽ có 2 phần tử là 1020.

Ví dụ 12. Tìm phần tử lớn thứ 2 trong Vector

Viết chương trình C++ để tạo một vector số nguyên và tìm phần tử lớn thứ hai trong vector.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> myVector = {10, 20, 30, 40, 50}; // tạo một vector với các phần tử cho trước

    // sắp xếp các phần tử của vector theo thứ tự giảm dần
    sort(myVector.begin(), myVector.end(), greater<int>());

    // tìm phần tử lớn thứ hai
    int secondLargest = myVector[1];

    // in ra phần tử lớn thứ hai
    cout << "Phan tu lon thu hai trong vector la: " << secondLargest << endl;

    return 0;
}

Ví dụ 13. Tìm phần tử chung của 2 vector

Viết chương trình C++ để tạo hai vector số nguyên và tìm phần tử chung của hai vector.

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec1 = {1, 2, 3, 4, 5};
    std::vector<int> vec2 = {3, 5, 7, 9, 11};
    std::vector<int> intersection;

    std::sort(vec1.begin(), vec1.end());
    std::sort(vec2.begin(), vec2.end());

    std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), std::back_inserter(intersection));

    std::cout << "Intersection of vec1 and vec2: ";
    for (auto i : intersection) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

Chương trình này sẽ tạo hai vector vec1vec2, sau đó sử dụng hàm std::sort() để sắp xếp các phần tử trong hai vector theo thứ tự tăng dần. Sau đó, sử dụng hàm std::set_intersection() để tìm các phần tử chung của hai vector và lưu trữ chúng vào vector intersection. Cuối cùng, chương trình sẽ in ra các phần tử chung của hai vector.

Lưu ý rằng để sử dụng hàm std::set_intersection(), ta cần bao gồm thư viện <algorithm> và sử dụng std::back_inserter() để thêm các phần tử của vector intersection vào cuối vector.

Ví dụ 14. Tìm dãy số Fibonacci

Viết chương trình C++ để tạo một vector số nguyên và kiểm tra xem vector có phải là một dãy số Fibonacci hay không.

Để kiểm tra xem một vector có phải là một dãy số Fibonacci hay không, chúng ta cần kiểm tra điều kiện là mỗi phần tử trong vector (kể từ phần tử thứ 3 trở đi) bằng tổng của hai phần tử trước nó. Sau đây là chương trình C++:

#include <iostream>
#include <vector>

bool isFibonacci(const std::vector<int>& vec) {
    if (vec.size() < 3) {
        // Trường hợp đặc biệt: vector có ít hơn 3 phần tử không thể là dãy Fibonacci
        return false;
    }

    for (int i = 2; i < vec.size(); i++) {
        if (vec[i] != vec[i-1] + vec[i-2]) {
            // Phần tử thứ i không bằng tổng của hai phần tử trước nó => không phải dãy Fibonacci
            return false;
        }
    }

    // Nếu tất cả các phần tử thỏa điều kiện trên, vector là dãy Fibonacci
    return true;
}

int main() {
    // Tạo một vector số nguyên
    std::vector<int> vec = {1, 1, 2, 3, 5, 8, 13};

    // Kiểm tra xem vector có phải là dãy Fibonacci hay không
    if (isFibonacci(vec)) {
        std::cout << "The vector is a Fibonacci sequence." << std::endl;
    } else {
        std::cout << "The vector is not a Fibonacci sequence." << std::endl;
    }

    return 0;
}

Chương trình này sử dụng hàm isFibonacci() để kiểm tra xem vector có phải là dãy Fibonacci hay không. Hàm này trả về true nếu vector thỏa mãn điều kiện là mỗi phần tử trong vector (kể từ phần tử thứ 3 trở đi) bằng tổng của hai phần tử trước nó, và trả về false trong trường hợp ngược lại.

Ở hàm main(), chúng ta tạo một vector số nguyên vec và sử dụng hàm isFibonacci() để kiểm tra xem vector này có phải là dãy Fibonacci hay không. Cuối cùng, chương trình sẽ in ra kết quả.

Ví dụ 15. Đảo ngược dãy số

Viết chương trình C++ để tạo một vector số nguyên và đảo ngược thứ tự các phần tử trong vector.

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    // Tạo một vector số nguyên
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // In ra vector ban đầu
    std::cout << "Original vector: ";
    for (auto i : vec) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // Đảo ngược thứ tự các phần tử trong vector
    std::reverse(vec.begin(), vec.end());

    // In ra vector sau khi đảo ngược thứ tự các phần tử
    std::cout << "Reversed vector: ";
    for (auto i : vec) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

Chương trình này sử dụng hàm std::reverse() để đảo ngược thứ tự các phần tử trong vector. Trước đó, chúng ta đã tạo một vector số nguyên vec với các giá trị là {1, 2, 3, 4, 5}. Sau khi đảo ngược thứ tự các phần tử bằng hàm std::reverse(), vector vec sẽ trở thành {5, 4, 3, 2, 1}. Cuối cùng, chương trình sẽ in ra vector ban đầu và vector sau khi đảo ngược thứ tự các phần tử.

So sánh vector và mảng truyền thống

Vector và mảng truyền thống là hai cấu trúc dữ liệu quan trọng trong lập trình và tính toán. Dưới đây là một số điểm khác biệt giữa chúng:

  1. Kích thước: Mảng có thể có nhiều chiều và kích thước có thể được chỉ định, trong khi vector là một mảng một chiều với kích thước cố định.

  2. Loại dữ liệu: Mảng có thể chứa bất kỳ loại dữ liệu nào, trong khi vector thường được sử dụng để chứa các giá trị số hoặc chuỗi.

  3. Khả năng truy cập: Mảng có thể được truy cập bằng cách sử dụng chỉ số cho từng chiều của mảng, trong khi vector chỉ có thể được truy cập bằng cách sử dụng chỉ số cho mỗi phần tử trong vector.

  4. Các phép toán: Vector hỗ trợ nhiều phép toán số học như cộng, trừ, nhân và chia, cũng như các phép toán đại số tuyến tính khác. Mảng cũng hỗ trợ các phép toán số học và đại số tuyến tính, nhưng vì kích thước và loại dữ liệu khác nhau của mảng, các phép toán này có thể có hiệu suất thấp hơn so với vector.

  5. Sử dụng: Vector thường được sử dụng trong tính toán khoa học và máy học để lưu trữ và xử lý dữ liệu số. Mảng được sử dụng rộng rãi trong các ứng dụng như xử lý ảnh, xử lý âm thanh và lập trình máy tính.

Tóm lại, vector và mảng truyền thống là hai cấu trúc dữ liệu có sự khác biệt đáng kể về kích thước, loại dữ liệu, khả năng truy cập, phép toán và mục đích sử dụng. Tuy nhiên, cả hai đều là cấu trúc dữ liệu quan trọng và được sử dụng rộng rãi trong lập trình và tính toán.

Kết luận

Vector trong C++ là một lớp đối tượng được sử dụng để lưu trữ một chuỗi các phần tử có thể thay đổi kích thước và được truy cập bằng chỉ số. Vector cung cấp các phương thức để thêm, xóa, sắp xếp và truy xuất các phần tử trong vector một cách dễ dàng và thuận tiện. Nó cũng cung cấp khả năng quản lý bộ nhớ tự động, loại bỏ nhu cầu phải cấp phát và giải phóng bộ nhớ một cách thủ công. Vector trong C++ thường được sử dụng để lưu trữ và xử lý dữ liệu số trong các ứng dụng khoa học và máy tính, cũng như để thay thế cho các mảng truyền thống trong một số trường hợp.

Một số điểm mạnh của vector trong C++ là:

  1. Dễ sử dụng và thuận tiện: Vector cung cấp nhiều phương thức để thêm, xóa và truy xuất các phần tử, giúp cho việc thao tác với vector trở nên dễ dàng và thuận tiện.

  2. Có khả năng mở rộng: Vector cho phép thêm và xóa các phần tử một cách động, vì vậy kích thước của vector có thể được thay đổi trong khi chương trình đang chạy.

  3. Có khả năng sắp xếp: Vector cung cấp các phương thức để sắp xếp các phần tử theo thứ tự tăng dần hoặc giảm dần.

  4. Quản lý bộ nhớ tự động: Vector tự động quản lý bộ nhớ, loại bỏ nhu cầu phải cấp phát và giải phóng bộ nhớ một cách thủ công.

  5. Tốc độ truy xuất nhanh: Vector cho phép truy xuất các phần tử bằng chỉ số, giống như mảng truyền thống, nhưng có thể được truy xuất một cách nhanh chóng hơn trong một số trường hợp.

Tất cả các điểm mạnh này làm cho vector trở thành một lựa chọn tốt cho việc lưu trữ và xử lý dữ liệu số trong các ứng dụng khoa học và máy tính, cũng như để thay thế cho các mảng truyền thống trong một số trường hợp./.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *