Hotline : 1800 1093 - 07 088 44444
Share

Vector trong C++ là gì? Tổng hợp các hàm vector trong C++ và cách sử dụng

20/04/2022

C++ là một ngôn ngữ mạnh mẽ, linh hoạt, gần gũi với ngôn ngữ của máy. Một đặc điểm khiến C++ trở nên vượt trội chính là thư viện vector trong C++. Vậy vector trong C++ là gì? Hãy cùng tìm hiểu những kiến thức cơ bản nhất về vector C++ trong bài viết dưới đây.

Vector trong C++ là gì?

Vector trong C++ là các mảng động (dynamic array) dùng để lưu trữ dữ liệu. Khác với array – dùng để lưu trữ dữ liệu tuần tự và có bản chất tính, các vector có độ linh hoạt cao hơn nhiều. Vector có thể tự động resize khi có phần tử được chèn hay xoá khỏi array, trong khi đó array thường có kích thước cố định.

Vector trong C++ là gì?
Vector trong C++ là gì?

Các phần tử vector C++ được đặt trong một bộ nhớ liền kề (contiguous storage), cho phép truy cập và duyệt thông qua một trình vòng lặp (iterator).

Vì sao nên sử dụng Vector C++?

Với vector trong C++, các developer không còn phải thực hiện nhiều thao tác thừa thãi, lặp đi lặp lại khi phải làm việc với mảng ở trong C++. Dưới đây là một số ưu điểm của kiểu vector trong C++ so với mảng truyền thống:

  • Không cần phải khai báo kích thước của mảng vì vector có khả năng tự resize.
  • Tự động điều chỉnh kích thước để chèn phần tử nếu vector đã đầy.
  • Cho biết số lượng các phần tử đang được lưu trữ.
  • Cho phép sử dụng chỉ số âm (chẳng hạn như A[-6], A[-5],…).

Standard Template Library là gì?

Standard Template Library (STL) là một tập hợp các lớp mẫu (template class), cung cấp các cấu trúc dữ liệu và hàm phổ biến như list, stack, array,… Đây là một thư viện bao gồm các lớp container, thuật toán và iterator. Vì là một thư viện có tính tổng quát nên mọi phần tử của thư viện đều được tham số hoá. Để làm việc được với STL, các developer cần có kiến thức cơ bản về việc xử lý các template class.

STL bao gồm bốn thành phần cơ bản:

  • Thuật toán.
  • Container.
  • Hàm.
  • Iterator.

Thuật toán

Thuật toán header xác định một tập hợp các hàm được thiết kế đặc biệt để sử dụng trên các phạm vi phần tử. Thành phần này hoạt động trên các container và cung cấp phương thức cho nhiều thao tác của container.

Container

Container lưu trữ các đối tương và dữ liệu, với tổng cộng bảy lớp theo tiêu chuẩn “first-class”, ba lớp adaptor và 7 file header cung cấp quyền truy cập vào những container/container adaptor này.

  • Sequence container: Triển khai các cấu trúc dữ liệu có thể được truy cập theo cách tuần tự.
    • vector
    • list
    • deque
    • array
    • forward_list
  • Container adaptor: Cung cấp nhiều giao diện khác cho các container tuần tự.
    • queue
    • priority_queue
    • stack
  • Associative container: Triển khai cấu trúc dữ liệu được sắp xếp, có thể tìm kiếm với độ phức tạp O(logn)
  • Unordered Associative Container: Triển khai cấu trúc dữ liệu không có thứ tự.
    • unordered_set
    • unordered_multiset
    • unordered_map
    • unordered_multimap
Adaptive container và unordered container
Adaptive container và unordered container
Sequence container và ordered container
Sequence container và ordered container

Hàm

STL bao gồm nhiều class có thể overload toán tử gọi hàm. Các instance của những class này được gọi là đối tượng hàm (functor). Các functor cho phép tuỳ chỉnh hoạt động của hàm thông qua các tham số được truyền.

Iterator

Đúng như tên gọi, iterator được sử dụng để làm việc với các chuỗi giá trị. Đây cũng là tính năng chính để đảm bảo tính khái quát hoá của STL.

Các Vector được lưu trữ trong C++ như thế nào?

Trong những phần còn lại của bài viết, ta sẽ tìm hiểu cách sử dụng thư viện vector trong C++. Trước hết, để tạo một vector, ta cần sử dụng cú pháp như dưới đây:

vector <object_type> variable_name;

Ví dụ:

#include <vector>
int main()
{
    std::vector<int> my_vector;
}

Ví dụ trên đã tạo một vector trống. Vector là mảng động nên không cần phải khai báo kích thước.

Tổng hợp các hàm Vector trong C++ và cách sử dụng

Một vector container trong STL cung cấp nhiều hàm vô cùng hữu ích, trong đó có 3 hàm cơ bản là:

  1. Modifider.
  2. Iterator.
  3. Capacity.

Modifier

  1. push_back(): Đẩy phần tử vào vị trí cuối của vector. Nếu kiểu đối tượng được truyền dưới dạng tham số trong push_back() không giống với kiểu vector thì sẽ trả về Exception.
  2. assign(): Gán giá trị mới vào các phần tử.
  3. pop_back(): Dùng để pop hoặc xoá phần tử ở cuối vector, đồng thời giảm kích thước của vector đi 1 đơn vị.
  4. insert(): Chèn phần tử mới vào phía trước phần tử trước vị trí trỏ của iterator. Ngoài ra ta cũng có thể thêm đối số count để đếm số lần chèn phần tử.
  5. erase(): Xoá phần tử khỏi container dựa trên vị trí hoặc phạm vi nhất định. Người dùng có thể truyền vị trí của phần tử cần xoá hoặc truyền phạm vi của phần tử.
  6. swap(): Dùng để hoán đổi nội dung của một vetor với vector khác có cùng kiểu (kích thước có thể khác nhau).
  7. clear(): Xoá mọi phần tử của vector container.

Ví dụ:

// Modifiers in vector 
#include <bits/stdc++.h> 
#include <vector> 
using namespace std; 
   
int main() 
{ 
    // Assign vector 
    vector<int> vec; 
   
    // fill the array with 12 seven times 
    vec.assign(7, 12); 
   
    cout << "The vector elements are: "; 
    for (int i = 0; i < 7; i++) 
        cout << vec[i] << " "; 
   
    // inserts 24 to the last position 
    vec.push_back(24); 
    int s = vec.size(); 
    cout << "nThe last element is: " << vec[s - 1]; 
 
     // prints the vector 
    cout << "nThe vector elements after push back are: "; 
    for (int i = 0; i < vec.size(); i++) 
    cout << vec[i] << " "; 
   
    // removes last element 
    vec.pop_back(); 
   
    // prints the vector 
    cout << "nThe vector elements after pop_back are: "; 
    for (int i = 0; i < vec.size(); i++) 
        cout << vec[i] << " "; 
   
    // inserts 10 at the beginning 
    vec.insert(vec.begin(), 10); 
   
    cout << "nThe first element after insert command is: " << vec[0]; 
   
    // removes the first element 
    vec.erase(vec.begin()); 
   
    cout << "nThe first element after erase command is: " << vec[0]; 
   
    // inserts at the beginning 
    vec.emplace(vec.begin(), 5); 
    cout << "nThe first element emplace is: " << vec[0]; 
   
    // Inserts 20 at the end 
    vec.emplace_back(20); 
    s = vec.size(); 
    cout << "nThe last element after emplace_back is: " << vec[s - 1]; 
   
    // erases the vector 
    vec.clear(); 
    cout << "nVector size after clear(): " << vec.size(); 
   
    // two vector to perform swap 
    vector<int> obj1, obj2; 
    obj1.push_back(2); 
    obj1.push_back(4); 
    obj2.push_back(6); 
    obj2.push_back(8); 
   
    cout << "nnVector 1: "; 
    for (int i = 0; i < obj1.size(); i++) 
        cout << obj1[i] << " "; 
   
    cout << "nVector 2: "; 
    for (int i = 0; i < obj2.size(); i++) 
        cout << obj2[i] << " "; 
   
    // Swaps obj1 and obj2 
    obj1.swap(obj2); 
   
    cout << "nAfter Swap nVector 1: "; 
    for (int i = 0; i < obj1.size(); i++) 
        cout << obj1[i] << " "; 
   
    cout << "nVector 2: "; 
    for (int i = 0; i < obj2.size(); i++) 
        cout << obj2[i] << " "; 
}

Output:

Output

Iterator

  1. begin(): Trả về iterator đang trỏ đến phần tử đầu tiên của vector.
  2. end(): Trả về iterator đang trỏ đến phần tử cuối cùng của vector.

Ví dụ:

#include <iostream> 
#include <vector> 
   
using namespace std; 
   
int main() 
{ 
    vector<int> vec1; 
   
    for (int i = 1; i <= 10; i++) 
        vec1.push_back(i); 
   
    cout << "Understanding begin() and end() function: " << endl; 
    for (auto i = vec1.begin(); i != vec1.end(); ++i) 
        cout << *i << " "; 
 
    return 0; 
}

Output:

Output

Trong ví dụ trên, ta đã định nghĩa một vector có tên vec1, sau đó đẩy các giá trị từ 1 đến 10 vào vector bằng một vòng lặp và hàm push_back trong C++. Câu lệnh tiếp theo dùng để in giá trị của vector bằng vòng lặp for, sử dụng begin() và end() để chỉ định điểm đầu và cuối của vòng lặp.

Capacity

  1. size(): Trả về số lượng phần tử có trong vector.
  2. max_size(): Trả về số lượng phần tử lớn nhất vector có thể chứa.
  3. capacity(): Trả về kích thước không gian lưu trữ hiện được cấp cho vector, biểu thị bằng số phần tử dựa trên bộ nhớ được cấp cho vector.
  4. resize(): Đổi kích thước container để chứa được n phần tử. Nếu kích thước hiện tại của vector lớn hơn n thì các phần tử ở sau sẽ bị xoá bị vector. Ngược lại, nếu kích thước hiện tại nhỏ hơn n thì các phần tử sẽ được chèn bổ sung vào cuối vector.
  5. empty(): Trả về True nếu vector đang trống, nếu không thì False.
#include <iostream> 
#include <vector> 
   
using namespace std; 
   
int main() 
{ 
    vector<int> vec1; 
   
    for (int i = 1; i <= 10; i++) 
        vec1.push_back(i); 
   
    cout << "Size of our vector: " << vec1.size(); 
    cout << "nCapacity of our vector: " << vec1.capacity(); 
    cout << "nMax_Size of our vector: " << vec1.max_size(); 
   
    // resizes the vector size to 4 
    vec1.resize(4); 
   
    // prints the vector size after resize() 
    cout << "nSize of our vector after resize: " << vec1.size(); 
   
    // checks if the vector is empty or not 
    if (vec1.empty() == false) 
        cout << "nVector is not empty"; 
    else
        cout << "nVector is empty"; 
   
    return 0; 
}

Output:

banner web hosting

Output

Lời kết

Trong bài viết này, ta đã tìm hiểu các kiến thức cơ bản nhất về cách sử dụng vector trong C++ cũng như những hàm phổ biến. Hy vọng qua bài viết này, các bạn đã có thể hình dung ra những cách khác nhau để sử dụng và định nghĩa vector ở trong C++. Nếu còn điều gì thắc mắc, hãy bình luận bên dưới để được hỗ trợ nhé!

5/5 - (2 bình chọn)

Mình là Bo - admin của Quản Trị Linux. Mình đã có 10 năm làm việc trong mảng System, Network, Security và đã trải nghiệm qua các chứng chỉ như CCNP, CISSP, CISA, đặc biệt là chống tấn công DDoS. Gần đây mình trải nghiệm thêm Digital Marketing và đã hòan thành chứng chỉ CDMP của PearsonVUE. Mình rất thích được chia sẻ và hỗ trợ cho mọi người, nhất là các bạn sinh viên. Hãy kết nối với mình nhé!
Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận