Mục tiêu của tiết học
- Hiểu sự khác biệt giữa mảng tĩnh (array) và vector (mảng động)
- Biết cách thao tác dữ liệu bằng vòng lặp, hàm, và cấu trúc dữ liệu
- Làm quen với mảng 2D, vector lồng vector, và struct + vector
- Thực hành qua ví dụ thực tế: Quản lý điểm sinh viên

1. MẢNG TRUYỀN THỐNG (STATIC ARRAY)
Mảng tĩnh có kích thước cố định — bạn phải biết số phần tử trước khi chạy chương trình.
Mã:
#include <iostream>
using namespace std;
int main() {
int arr[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < 5; i++) {
cout << "Phan tu " << i << ": " << arr[i] << endl;
}
}
arr[0]là phần tử đầu tiên.- Mảng trong C++ bắt đầu từ chỉ số 0.
- Không thể thêm/xóa phần tử sau khi khai báo.
2. VECTOR – MẢNG ĐỘNG (DYNAMIC ARRAY)
vectortrong C++ là mảng có thể tự mở rộng, nằm trong thư viện<vector>.
Mã:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v; // khởi tạo vector rỗng
v.push_back(10);
v.push_back(20);
v.push_back(30);
cout << "So phan tu: " << v.size() << endl;
for (int x : v) cout << x << " ";
}
| Hàm | Chức năng |
|---|---|
push_back(x) | Thêm phần tử vào cuối |
pop_back() | Xóa phần tử cuối |
size() | Số phần tử |
clear() | Xóa toàn bộ dữ liệu |
front(), back() | Lấy phần tử đầu/cuối |
at(i) | Truy cập phần tử thứ i an toàn |
3. VECTOR 2 CHIỀU (BẢNG, LƯỚI)
Khi bạn cần lưu dữ liệu dạng bảng, ma trận, bản đồ (map grid trong game chẳng hạn).
Mã:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> grid(3, vector<int>(3, 0)); // 3x3 toàn 0
grid[1][1] = 5; // Gán giá trị trung tâm
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << grid[i][j] << " ";
}
cout << endl;
}
}
Mã:
0 0 0
0 5 0
0 0 0
4. VECTOR + STRUCT (QUẢN LÝ DỮ LIỆU PHỨC TẠP)
Lưu danh sách sinh viên, nhân vật, item, v.v...
Mã:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct Student {
string name;
double score;
};
int main() {
vector<Student> students;
students.push_back({"Huy", 9.5});
students.push_back({"Linh", 8.7});
students.push_back({"Khang", 7.8});
double total = 0;
for (auto& s : students) {
cout << s.name << " - " << s.score << endl;
total += s.score;
}
cout << "Diem trung binh: " << total / students.size() << endl;
}
- Dễ mở rộng
- Tạo hệ thống inventory, danh sách NPC, log dữ liệu,...
5. VECTOR NÂNG CAO – SẮP XẾP & TÌM KIẾM
Mã:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> nums = {5, 2, 9, 1, 7};
sort(nums.begin(), nums.end()); // sắp tăng dần
reverse(nums.begin(), nums.end()); // đảo ngược
for (int n : nums) cout << n << " ";
}
Mã:
9 7 5 2 1
sort() & reverse() nằm trong <algorithm>.Có thể tùy chỉnh quy tắc sắp xếp bằng lambda function.
BÀI TẬP NÂNG CAO
Hãy viết chương trình Quản lý lớp học:
- Dùng
struct Student(tên, điểm, ID). - Dùng
vector<Student>để lưu danh sách. - Cho phép thêm, xóa, xem danh sách, tính trung bình.
- Sắp xếp sinh viên theo điểm từ cao đến thấp.
TỔNG KẾT
| Chủ đề | Ghi nhớ |
|---|---|
| Mảng tĩnh | Nhanh, nhưng cố định |
| Vector | Linh hoạt, dễ dùng |
| Struct + Vector | Dữ liệu phức tạp |
| Algorithm | Dễ xử lý danh sách lớn |
