1. Thuật Toán Không Thay Đổi Dữ Liệu
Các thuật toán không làm thay đổi phần tử trong container.
1.1 Tìm kiếm (find và find_if)
vector<int> du_lieu = {2, 4, 6, 8, 10};
// Tìm phần tử có giá trị 6
auto vi_tri = find(du_lieu.begin(), du_lieu.end(), 6);
if (vi_tri != du_lieu.end()) {
cout << "Tim thay: " << *vi_tri << endl;
}
// Tìm phần tử đầu tiên lớn hơn 7
auto vi_tri2 = find_if(du_lieu.begin(), du_lieu.end(), [](int gt) {
return gt > 7;
});
cout << "Gia tri >7: " << *vi_tri2 << endl;
1.2 Đếm (count và count_if)
vector<int> chuoi = {5, 3, 5, 7, 5, 9};
int dem = count(chuoi.begin(), chuoi.end(), 5); // Đếm số 5
int dem_le = count_if(chuoi.begin(), chuoi.end(), [](int x) {
return x % 2 != 0;
}); // Đếm số lẻ
1.3 Duyệt (for_each)
vector<int> gt = {10, 20, 30};
for_each(gt.begin(), gt.end(), [](int& x) {
x += 5; // Tăng mỗi phần tử 5 đơn vị
});
2. Thuật Toán Thay Đổi Dữ Liệu
Các thuật toán làm biến đổi phần tử trong container.
2.1 Sao chép (copy và copy_if)
vector<int> nguon = {11, 12, 13, 14};
vector<int> dich(4);
copy(nguon.begin(), nguon.end(), dich.begin());
vector<int> so_chan;
copy_if(nguon.begin(), nguon.end(), back_inserter(so_chan), [](int x) {
return x % 2 == 0;
});
2.2 Biến đổi (transform)
vector<int> goc = {3, 4, 5};
vector<int> binh_phuong(3);
transform(goc.begin(), goc.end(), binh_phuong.begin(), [](int x) {
return x * x;
});
2.3 Xóa phần tử (remove và erase)
vector<int> ds = {7, 8, 9, 8, 10};
auto cuoi_moi = remove(ds.begin(), ds.end(), 8);
ds.erase(cuoi_moi, ds.end());
3. Thuật Toán Sắp Xếp
3.1 Sắp xếp cơ bản
vector<int> sap_xep = {15, 12, 18};
sort(sap_xep.begin(), sap_xep.end());
stable_sort(sap_xep.begin(), sap_xep.end());
3.2 Tìm kiếm nhị phân
vector<int> da_sx = {20, 30, 40, 50};
bool ton_tai = binary_search(da_sx.begin(), da_sx.end(), 30);
auto can_duoi = lower_bound(da_sx.begin(), da_sx.end(), 35);
4. Thuật Toán Heap
vector<int> heap = {25, 10, 35};
make_heap(heap.begin(), heap.end());
heap.push_back(40);
push_heap(heap.begin(), heap.end());
5. Thuật Toán Số Học
vector<int> so = {6, 7, 8};
int tong = accumulate(so.begin(), so.end(), 0);
vector<int> tang_dan(4);
iota(tang_dan.begin(), tang_dan.end(), 5);
6. Câu Hỏi Thường Gặp
Sự khác biệt giữa sort và stable_sort?
sort sử dụng giải thuật không ổn định, stable_sort duy trì thứ tự các phần tử bằng nhau.
Tại sao remove cần kết hợp với erase?
remove chỉ di chuyển phần tử, erase xóa vật lý khỏi container.
Thuật toán nào yêu cầu dữ liệu đã sắp xếp?
binary_search, set_union, merge và các thao tác tập hợp yêu cầu dữ liệu đã sắp thứ tự.