[STL] Sử dụng Vector trong C++
Trong ngôn ngữ lập trình C++, vector là một trong những cấu trúc dữ liệu linh hoạt và mạnh mẽ nhất từ thư viện tiêu chuẩn (STL). Vector cung cấp một cách hiệu quả để lưu trữ và quản lý một tập hợp các phần tử có thể thay đổi kích thước. Việc sử dụng vector không chỉ giúp chúng ta tiết kiệm thời gian và công sức trong việc quản lý dữ liệu mà còn cung cấp các công cụ mạnh mẽ để thực hiện các thao tác và xử lý dữ liệu phức tạp.
Trong bài viết này, mình sẽ tìm hiểu về cách sử dụng vector trong C++, bao gồm cách khai báo, thao tác truy cập, thêm/xóa phần tử, sắp xếp và tìm kiếm, cũng như các tình huống thực tế mà mình có thể gặp phải khi làm việc với vector.
Vector trong C++ là gì?
"Vector" là một cấu trúc dữ liệu thuộc thư viện chuẩn (STL - Standard Template Library). Nó cung cấp một cách linh hoạt và tiện lợi để lưu trữ và quản lý một chuỗi các phần tử.
Vector trong C++ được triển khai dưới dạng một mảng động (dynamic array), cho phép thêm, xóa phần tử một cách dễ dàng và hiệu quả. Các phần tử trong Vector được lưu trữ theo thứ tự liên tục trong bộ nhớ và được truy cập thông qua chỉ số.
Bài viết này được đăng tại [free tuts .net]
Một số tính năng quan trọng của Vector trong C++ bao gồm:
-
Tăng kích thước tự động: Vector tự động thay đổi kích thước của nó khi cần thiết, giúp quản lý bộ nhớ một cách hiệu quả.
-
Truy cập ngẫu nhiên: Bạn có thể truy cập các phần tử trong Vector bằng cách sử dụng chỉ số.
-
Thao tác thêm, xóa phần tử: Vector cho phép thêm, xóa phần tử từ đầu, cuối hoặc ở bất kỳ vị trí nào trong Vector một cách dễ dàng.
-
Iterator hỗ trợ: Vector cung cấp iterator cho phép bạn duyệt qua tất cả các phần tử trong Vector.
Vector trong C++ là một trong những cấu trúc dữ liệu phổ biến và hữu ích nhất, được sử dụng rộng rãi trong việc lập trình ứng dụng C++ hiện đại.
Khai báo và khởi tạo Vector trong C++
Khai báo Vector
- Vector trong C++ được khai báo bằng cách sử dụng lớp std::vector.
- Cú pháp khai báo:
std::vector<kiểu_dữ_liệu> tên_vector;
Ví dụ:
#include <iostream> #include <vector> //Bài đăng tại freetuts.net int main() { std::vector<int> myVector; return 0; }
Khởi tạo Vector với các giá trị khởi đầu:
- Cú pháp khởi tạo:
std::vector<kiểu_dữ_liệu> tên_vector = {giá_trị1, giá_trị2, ...};
Ví dụ:
#include <iostream> #include <vector> //Bài đăng tại freetuts.net int main() { std::vector<int> myVector = {1, 2, 3, 4, 5}; return 0; }
Khởi tạo Vector với kích thước và giá trị mặc định
- Cú pháp khởi tạo:
std::vector<kiểu_dữ_liệu> tên_vector (kích_thước, giá_trị_mặc_định)
;
Ví dụ:
#include <iostream> #include <vector> //Bài đăng tại freetuts.net int main() { std::vector<int> myVector(5, 0); // Vector với 5 phần tử có giá trị mặc định là 0 return 0; }
Truy cập vào phần tử của Vector trong C++
Truy cập theo chỉ số
- Cú pháp:
ten_vector[index]
để truy cập vào phần tử ở vị trí index trong Vector.
Ví dụ:
#include <iostream> #include <vector> //Bài đăng tại freetuts.net int main() { std::vector<int> myVector = {1, 2, 3, 4, 5}; std::cout << "Phan tu tai vi tri thu 2: " << myVector[1] << std::endl; return 0; }
Output:
Phan tu tai vi tri thu 2: 2
Sử dụng Iterator
- Iterator cho phép duyệt qua các phần tử của Vector một cách linh hoạt.
- Cú pháp:
std::vector<kiểu_dữ_liệu>::iterator
hoặc auto.
Ví dụ:
#include <iostream> #include <vector> //Bài đăng tại freetuts.net int main() { std::vector<int> myVector = {1, 2, 3, 4, 5}; // Sử dụng Iterator để duyệt qua các phần tử của Vector std::cout << "Cac phan tu cua Vector:" << std::endl; for (auto it = myVector.begin(); it != myVector.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; }
Output:
Cac phan tu cua Vector: 1 2 3 4 5
Thao tác thêm và xóa phần tử trong C++
Thêm phần tử vào Vector
push_back(value):
Thêm phần tử value vào cuối Vector.insert(iterator, value):
Chèn phần tử value vào Vector tại vị trí được chỉ định bởi iterator.
Ví dụ:
#include <iostream> #include <vector> int main() { std::vector<int> myVector = {1, 2, 3}; //Bài đăng tại freetuts.net // Thêm phần tử vào cuối Vector myVector.push_back(4); // Chèn phần tử vào vị trí thứ 2 auto it = myVector.begin() + 1; myVector.insert(it, 5); // In ra Vector sau khi thêm std::cout << "Vector sau khi them: "; for (int num : myVector) { std::cout << num << " "; } std::cout << std::endl; return 0; }
Output:
Vector sau khi them: 1 5 2 3 4
Xóa phần tử khỏi Vector
pop_back():
Xóa phần tử cuối cùng của Vector.erase(iterator):
Xóa phần tử tại vị trí được chỉ định bởi iterator.
Ví dụ:
#include <iostream> #include <vector> int main() { std::vector<int> myVector = {1, 2, 3, 4, 5}; //Bài đăng tại freetuts.net // Xóa phần tử cuối cùng của Vector myVector.pop_back(); // Xóa phần tử thứ 3 của Vector auto it = myVector.begin() + 2; myVector.erase(it); // In ra Vector sau khi xóa std::cout << "Vector sau khi xoa: "; for (int num : myVector) { std::cout << num << " "; } std::cout << std::endl; return 0; }
Output:
Vector sau khi xoa: 1 2 4
Sắp xếp và tìm kiếm trong Vector trong C++
Sắp xếp Vector
sort(begin, end):
Sắp xếp các phần tử của Vector từ vị trí begin đến vị trí end.sort(compare):
Sắp xếp Vector sử dụng hàm so sánh compare.
Ví dụ:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> myVector = {3, 1, 4, 1, 5, 9, 2, 6}; // Sắp xếp Vector std::sort(myVector.begin(), myVector.end()); //Bài đăng tại freetuts.net // In ra Vector sau khi sắp xếp std::cout << "Vector sau khi sap xep: "; for (int num : myVector) { std::cout << num << " "; } std::cout << std::endl; return 0; }
Output:
Vector sau khi sap xep: 1 1 2 3 4 5 6 9
Tìm kiếm phần tử trong Vector:
find(begin, end, value):
Tìm kiếm phần tử có giá trị value trong Vector từ vị trí begin đến vị trí end.find_if(begin, end, predicate):
Tìm kiếm phần tử thỏa mãn điều kiện được xác định bởipredicate
.
Ví dụ:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> myVector = {3, 1, 4, 1, 5, 9, 2, 6}; //Bài đăng tại freetuts.net // Tìm kiếm phần tử có giá trị 5 trong Vector auto it = std::find(myVector.begin(), myVector.end(), 5); if (it != myVector.end()) { std::cout << "Phan tu 5 duoc tim thay tai vi tri " << std::distance(myVector.begin(), it) << std::endl; } else { std::cout << "Phan tu 5 khong duoc tim thay trong Vector" << std::endl; } return 0; }
Output:
Phan tu 5 duoc tim thay tai vi tri 4
Sử dụng Vector trong các tình huống thực tế trong C++
Lưu trữ dữ liệu
- Vector là một cấu trúc dữ liệu linh hoạt và tiện lợi để lưu trữ dữ liệu có thể thay đổi kích thước.
Ví dụ: Lưu trữ danh sách sinh viên trong một lớp học.
#include <iostream> #include <vector> #include <string> int main() { std::vector<std::string> students; //Bài đăng tại freetuts.net // Thêm sinh viên vào Vector students.push_back("Alice"); students.push_back("Bob"); students.push_back("Charlie"); // In ra danh sách sinh viên std::cout << "Danh sach sinh vien:" << std::endl; for (const std::string& student : students) { std::cout << student << std::endl; } return 0; }
Output:
Danh sach sinh vien: Alice Bob Charlie
Thao tác với dữ liệu số lớn
- Vector cho phép lưu trữ và thao tác với một lượng lớn dữ liệu một cách hiệu quả.
Ví dụ: Tính tổng của một dãy số lớn.
#include <iostream> #include <vector> #include <numeric> // For std::accumulate int main() { std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // Tính tổng của dãy số int sum = std::accumulate(numbers.begin(), numbers.end(), 0); //Bài đăng tại freetuts.net std::cout << "Tong cua day so: " << sum << std::endl; return 0; }
Output:
Tong cua day so: 55
Sử dụng trong các thuật toán và tác vụ lặp
- Vector là một công cụ mạnh mẽ để thực hiện các thuật toán và tác vụ lặp.
Ví dụ: Sử dụng Vector để lưu trữ và sắp xếp danh sách sinh viên theo điểm số.
#include <iostream> #include <vector> #include <algorithm> struct Student { std::string name; int score; }; int main() { std::vector<Student> students = {{"Alice", 85}, {"Bob", 90}, {"Charlie", 75}}; // Sắp xếp danh sách sinh viên theo điểm số giảm dần std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.score > b.score; }); //Bài đăng tại freetuts.net // In ra danh sách sinh viên đã được sắp xếp std::cout << "Danh sach sinh vien sau khi sap xep:" << std::endl; for (const Student& student : students) { std::cout << student.name << " - Diem: " << student.score << std::endl; } return 0; }
Output:
Danh sach sinh vien sau khi sap xep: Bob - Diem: 90 Alice - Diem: 85 Charlie - Diem: 75
Kết bài
Trên đây là một cái nhìn tổng quan về việc sử dụng vector trong ngôn ngữ lập trình C++. Vector là một công cụ mạnh mẽ và linh hoạt cho việc lưu trữ và quản lý dữ liệu, và nó rất hữu ích trong nhiều tình huống khác nhau. Từ cách khai báo và thao tác cơ bản đến việc sắp xếp, tìm kiếm và xử lý dữ liệu, vector cung cấp một loạt các tính năng và chức năng mạnh mẽ.
Hy vọng rằng thông qua bài viết này, bạn đã có cái nhìn rõ ràng hơn về cách sử dụng vector trong C++ và cách áp dụng nó trong các dự án của mình. Hãy tiếp tục thực hành và nâng cao kỹ năng lập trình của bạn với vector và các công cụ khác trong STL để trở thành một lập trình viên thành thạo hơn.