Các Thuật Toán STL Trong C++ Cho Xử Lý Dữ Liệu

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ự.

Thẻ: STL C++ ThuậtToán Vector Iterator

Đăng vào ngày 21 tháng 6 lúc 02:46