Vector trong C++ là gì? Tổng hợp các hàm vector trong C++ và cách sử dụng
Thịnh Văn Hạnh 15/09/2023 1102 Lượt xem Chia sẻ bài viết
Với sự phát triển của thế giới công nghệ thông tin, nhu cầu giao tiếp của con người với các thiết bị thông minh cũng ngày càng tăng lên, đó cũng là lý do mà các ngôn ngữ lập trình ngày càng mở rộng và phát triển. Là một trong những ngôn ngữ phổ biến hàng đầu thế giới, C++ có nhiều ứng dụng thực tiễn với người dùng. Cùng BKNS tìm hiểu vector trong C++ là gì, tổng hợp các hàm vector trong C++ và cách sử dụng chúng.
Tóm Tắt Bài Viết
Vector trong C++ là gì?
Trong ngôn ngữ lập trình C++, “vector” là một lớp (class) trong thư viện chuẩn (STL – Standard Template Library) được cung cấp bởi C++. Nó thường được sử dụng để thực hiện mảng động, tức là một dãy các phần tử có thể thay đổi kích thước một cách linh hoạt trong quá trình chạy chương trình.
“Vector” trong C++ cho phép bạn thêm và xóa các phần tử từ cuối danh sách một cách dễ dàng, và nó sẽ tự động quản lý việc cấp phát và giải phóng bộ nhớ để đảm bảo rằng mảng có đủ dung lượng để chứa các phần tử mới.
Điều này làm cho việc sử dụng “vector” trở nên tiện lợi hơn so với việc quản lý mảng thông thường trong C++, vì bạn không cần lo lắng về việc quản lý bộ nhớ thủ công.
Dưới đây là một ví dụ cơ bản về việc sử dụng “vector” trong C++:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector;
//Thêm các phần tử vào vector
myVector.push_back(10);
myVector.push_back(20);
myVector.push_back(30);
// Truy cập các phần tử trong vector
std::cout << "Phan tu thu 2: " << myVector[1] << std::endl;
return 0;
}
Trong ví dụ trên, chúng ta sử dụng “vector” để lưu trữ các số nguyên và thực hiện việc thêm phần tử vào vector, sau đó truy cập và in ra phần tử thứ hai (chỉ số 1) trong vector.
Vì sao nên sử dụng Vector C++?
Sử dụng vector trong C++, những nhà phát triển không còn cần thực hiện những công việc lặp đi lặp lại, phiền toái khi làm việc với mảng so với cách truyền thống. Dưới đây là một số lợi ích của việc sử dụng vector trong C++ so với việc sử dụng mảng thông thường:
- • Không cần khai báo kích thước ban đầu cho mảng, bởi vector có khả năng tự động thay đổi kích thước (resize) theo nhu cầu.
- • Vector tự động điều chỉnh kích thước để chứa phần tử mới khi nó đã đạt tới giới hạn lưu trữ.
- • Cho phép theo dõi số lượng phần tử đang được lưu trữ trong vector.
- • Hỗ trợ truy cập bằng chỉ số âm (như A[-6], A[-5], …) mở ra khả năng sử dụng chỉ số âm hữu ích trong việc truy cập phần tử.
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”, 3 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
Bạn có thể tìm hiểu thêm cách sắp xếp bằng các thuật toán sắp xếp như QuickSort.
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à:
- • Modifider.
- • Iterator.
- • Capacity.
Modifier
- • 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.
- • assign(): Gán giá trị mới vào các phần tử.
- • 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ị.
- • 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ử. - • 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ử.
- • 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).
- • 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:
Iterator
- • begin(): Trả về iterator đang trỏ đến phần tử đầu tiên của vector.
- • 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:
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
- • size(): Trả về số lượng phần tử có trong vector.
- • max_size(): Trả về số lượng phần tử lớn nhất vector có thể chứa.
- • 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.
- • 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.
- • 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:
Kết luận
Trong tài liệu này, chúng ta đã tiếp cận các kiến thức cơ bản về việc sử dụng vector trong ngôn ngữ lập trình C++, cũng như các hàm phổ biến liên quan đến nó. Hy vọng rằng thông qua tài liệu này, bạn đã có thêm những cách khác nhau để áp dụng và hiểu về khái niệm vector trong C++ là gì. Nếu bạn còn bất kỳ điều gì cần được giải đáp thêm, xin vui lòng để lại bình luận phía dưới để nhận được sự hỗ trợ.
>Xem thêm: