[STL] Các hàm thường dùng của lớp Vector trong C++
Trong lập trình C++, std::vector là một trong những cấu trúc dữ liệu quan trọng nhất trong thư viện tiêu chuẩn (STL). Nó cung cấp một mảng động có khả năng mở rộng tự động, giúp quản lý và xử lý dữ liệu một cách linh hoạt. Điều này làm cho vector trở thành một công cụ mạnh mẽ được sử dụng rộng rãi trong nhiều ứng dụng.
Trong bài viết này, mình sẽ tìm hiểu các hàm thông dụng của lớp vector trong C++. Từ việc thêm và xóa phần tử đến truy xuất và sắp xếp, chúng ta sẽ tìm hiểu về cách sử dụng các hàm này để quản lý và xử lý dữ liệu một cách hiệu quả. Hãy cùng nhau đi vào chi tiết để hiểu rõ hơn về cách làm việc với vector trong C++ và những ứng dụng thực tiễn của nó.
Vector trong C++ là gì và vai trò của nó trong STL?
Trong C++, vector là một loại dữ liệu được cung cấp sẵn trong thư viện chuẩn (STL - Standard Template Library). Vector là một cấu trúc dữ liệu mảng động, cho phép lưu trữ một tập hợp các phần tử có cùng kiểu dữ liệu một cách tuần tự. Một trong những đặc điểm nổi bật của vector là khả năng thay đổi kích thước của nó một cách linh hoạt, tức là có thể thêm hoặc xóa phần tử một cách dễ dàng mà không cần phải quan tâm đến việc quản lý bộ nhớ.
Vai trò của vector trong STL là cung cấp một cấu trúc dữ liệu linh hoạt và hiệu quả để lưu trữ dữ liệu trong các ứng dụng C++. Nó được sử dụng rộng rãi trong nhiều tình huống khác nhau, bao gồm:
Bài viết này được đăng tại [free tuts .net]
-
Lưu trữ và quản lý dữ liệu: Vector được sử dụng để lưu trữ các phần tử của cùng một kiểu dữ liệu và cung cấp các phương thức để thêm, xóa, truy xuất và sắp xếp các phần tử này.
-
Tích hợp với các thuật toán: Vector cung cấp các phương thức để thực hiện các thao tác cơ bản như sắp xếp, tìm kiếm, đảo ngược, thay đổi nội dung và nhiều hơn nữa. Các thuật toán này có thể được áp dụng trực tiếp trên vector một cách thuận tiện.
-
Thao tác với dữ liệu tuần tự: Do vector lưu trữ dữ liệu một cách tuần tự trong bộ nhớ, nên nó rất thích hợp cho việc thực hiện các thao tác trên dữ liệu tuần tự như danh sách, hàng đợi, ngăn xếp và nhiều cấu trúc dữ liệu khác.
Tóm lại, vector là một thành phần quan trọng trong STL của C++, cung cấp một cách linh hoạt và tiện lợi để làm việc với dữ liệu tuần tự trong các ứng dụng lập trình.
Các hàm thường dùng của lớp Vector trong C++
Thêm và xóa phần tử
push_back()
Thêm một phần tử vào cuối vector.
Ví dụ:
std::vector<int> numbers; numbers.push_back(10);
pop_back()
Xóa phần tử cuối cùng khỏi vector.
Ví dụ:
std::vector<int> numbers = {1, 2, 3}; numbers.pop_back();
insert()
Chèn một phần tử vào vị trí bất kỳ trong vector.
Ví dụ:
std::vector<int> numbers = {1, 3, 4}; numbers.insert(numbers.begin() + 1, 2); // Chèn số 2 vào vị trí thứ 2
erase()
Xóa phần tử tại một vị trí hoặc một dải phần tử trong vector.
Ví dụ:
std::vector<int> numbers = {1, 2, 3, 4, 5}; numbers.erase(numbers.begin() + 2); // Xóa phần tử thứ 3
Truy xuất phần tử
at()
Truy cập phần tử tại một vị trí cụ thể trong vector và kiểm tra giới hạn của vector.
Ví dụ:
std::vector<int> numbers = {1, 2, 3}; int value = numbers.at(1); // Lấy giá trị của phần tử thứ 2
[]
Truy cập phần tử tại một vị trí cụ thể trong vector. Không kiểm tra giới hạn của vector, có thể gây lỗi nếu vị trí truy cập vượt quá kích thước của vector.
Ví dụ:
std::vector<int> numbers = {1, 2, 3}; int value = numbers[1]; // Lấy giá trị của phần tử thứ 2
front()
Trả về giá trị của phần tử đầu tiên trong vector.
Ví dụ:
std::vector<int> numbers = {1, 2, 3}; int firstValue = numbers.front(); // Lấy giá trị của phần tử đầu tiên
back()
Trả về giá trị của phần tử cuối cùng trong vector.
Ví dụ:
std::vector<int> numbers = {1, 2, 3}; int lastValue = numbers.back(); // Lấy giá trị của phần tử cuối cùng
Kiểm tra và truy vấn
size()
Hàm size()
được sử dụng để trả về số lượng phần tử hiện có trong vector.
Ví dụ:
#include <iostream> #include <vector> // Bài đăng tại freetuts.net int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; // Sử dụng hàm size() để kiểm tra số lượng phần tử trong vector std::cout << "Số lượng phần tử trong vector: " << numbers.size() << std::endl; return 0; }
Output:
Số lượng phần tử trong vector: 5
capacity()
Hàm capacity()
trả về dung lượng hiện tại của vector, tức là số lượng phần tử mà vector có thể chứa mà không cần phải cấp phát thêm bộ nhớ.
Ví dụ:
#include <iostream> #include <vector> int main() { std::vector<int> numbers; // Bài đăng tại freetuts.net // Sử dụng hàm capacity() để kiểm tra dung lượng của vector std::cout << "Dung lượng của vector: " << numbers.capacity() << std::endl; return 0; }
Output:
Dung lượng của vector: 0
empty()
Hàm empty()
trả về true nếu vector không chứa bất kỳ phần tử nào, ngược lại trả về false.
Ví dụ:
#include <iostream> #include <vector> // Bài đăng tại freetuts.net int main() { std::vector<int> numbers; // Sử dụng hàm empty() để kiểm tra vector có rỗng không if (numbers.empty()) { std::cout << "Vector rỗng." << std::endl; } else { std::cout << "Vector không rỗng." << std::endl; } return 0; }
Output:
Vector rỗng.
Sắp xếp và thay đổi
sort()
Hàm sort() được sử dụng để sắp xếp các phần tử trong vector theo thứ tự tăng dần.
Ví dụ:
#include <iostream> #include <vector> #include <algorithm> // Để sử dụng hàm sort() // Bài đăng tại freetuts.net int main() { std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6}; // Sắp xếp các phần tử trong vector theo thứ tự tăng dần std::sort(numbers.begin(), numbers.end()); // In ra vector sau khi sắp xếp std::cout << "Vector sau khi sắp xếp: "; for (int num : numbers) { std::cout << num << " "; } std::cout << std::endl; // Bài đăng tại freetuts.net return 0; }
Output:
Vector sau khi sắp xếp: 1 1 2 3 4 5 6 9
reverse()
Hàm reverse()
được sử dụng để đảo ngược thứ tự các phần tử trong vector.
Ví dụ:
#include <iostream> #include <vector> #include <algorithm> // Để sử dụng hàm reverse() // Bài đăng tại freetuts.net int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; // Đảo ngược thứ tự các phần tử trong vector std::reverse(numbers.begin(), numbers.end()); // In ra vector sau khi đảo ngược std::cout << "Vector sau khi đảo ngược: "; for (int num : numbers) { std::cout << num << " "; } std::cout << std::endl; return 0; }
Output:
Vector sau khi đảo ngược: 5 4 3 2 1
swap()
Hàm swap()
được sử dụng để hoán đổi nội dung giữa hai vector.
Ví dụ:
#include <iostream> #include <vector> int main() { std::vector<int> numbers1 = {1, 2, 3}; std::vector<int> numbers2 = {4, 5, 6}; // Bài đăng tại freetuts.net // Trao đổi nội dung giữa hai vector numbers1.swap(numbers2); // In ra vector sau khi hoán đổi std::cout << "Vector 1 sau khi hoán đổi: "; for (int num : numbers1) { std::cout << num << " "; } std::cout << std::endl; std::cout << "Vector 2 sau khi hoán đổi: "; for (int num : numbers2) { std::cout << num << " "; } std::cout << std::endl; return 0; }
Output:
Vector 1 sau khi hoán đổi: 4 5 6 Vector 2 sau khi hoán đổi: 1 2 3
clear()
Hàm clear()
được sử dụng để xóa tất cả các phần tử trong vector, làm cho vector trở thành một vector rỗng.
Ví dụ:
#include <iostream> #include <vector> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; // Bài đăng tại freetuts.net // Xóa tất cả các phần tử của vector numbers.clear(); // In ra vector sau khi xóa std::cout << "Số lượng phần tử sau khi xóa: " << numbers.size() << std::endl; return 0; }
Output:
Số lượng phần tử sau khi xóa: 0
Ví dụ các hàm thường dùng của lớp Vector trong C++
Thêm và xóa phần tử
#include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3}; // Bài đăng tại freetuts.net // Thêm phần tử vào cuối vector vec.push_back(4); // Xóa phần tử cuối cùng của vector vec.pop_back(); // Chèn phần tử vào vị trí bất kỳ vec.insert(vec.begin() + 1, 5); // Xóa phần tử tại vị trí bất kỳ vec.erase(vec.begin() + 2); // In ra các phần tử của vector for (int num : vec) { std::cout << num << " "; } return 0; }
Output:
1 5 3
Truy xuất phần tử
#include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // Truy xuất phần tử ở vị trí 2 int element = vec.at(2); // Truy xuất phần tử ở vị trí 3 int element2 = vec[3]; // Lấy phần tử đầu tiên int first_element = vec.front(); // Bài đăng tại freetuts.net // Lấy phần tử cuối cùng int last_element = vec.back(); std::cout << element << " " << element2 << " " << first_element << " " << last_element; return 0; }
Output:
3 4 1 5
Kiểm tra và truy vấn
#include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // Kiểm tra số lượng phần tử của vector int size = vec.size(); // Bài đăng tại freetuts.net // Kiểm tra dung lượng của vector int capacity = vec.capacity(); // Kiểm tra xem vector có rỗng không bool is_empty = vec.empty(); std::cout << "Size: " << size << ", Capacity: " << capacity << ", Empty: " << is_empty; return 0; }
Output:
Size: 5, Capacity: 5, Empty: 0
Sắp xếp và thay đổi
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {3, 1, 4, 1, 5, 9}; // Bài đăng tại freetuts.net // Sắp xếp vector tăng dần std::sort(vec.begin(), vec.end()); // Đảo ngược thứ tự các phần tử trong vector std::reverse(vec.begin(), vec.end()); // Trao đổi nội dung giữa hai vector std::vector<int> vec2 = {6, 7, 8}; vec.swap(vec2); // Xóa tất cả các phần tử của vector vec.clear(); return 0; }
Kết bài
Trong bài viết này, mình đã tìm hiểu về các hàm thông dụng của lớp vector trong STL của C++. mình đã tìm hiểu cách thêm và xóa phần tử, truy xuất phần tử, kiểm tra và truy vấn về số lượng và dung lượng của vector, cũng như các hàm sắp xếp và thay đổi nội dung của vector.
Việc hiểu và sử dụng thành thạo các hàm này sẽ giúp mình làm việc hiệu quả với dữ liệu vector trong các ứng dụng C++ của mình. Hy vọng bài viết này đã cung cấp cho bạn cái nhìn tổng quan và kiến thức cần thiết để bắt đầu làm việc với lớp vector trong STL.