1. Vấn đề nó giải quyết
C++20 thêm thao tác ngắn cho kiểm tra prefix/suffix, membership associative, xóa theo predicate và tạo std::array từ built-in array literal. Nó làm một giả định quan trọng trở nên rõ và có thể kiểm tra.
2. Kiến thức cần có
Chuỗi, associative container, array và predicate.
Bạn cần biết biên dịch chương trình ngắn và đọc output.
3. Ý tưởng cốt lõi
Đây là các ý định có tên: hỏi hai đầu chuỗi, hỏi set về membership, xóa phần tử khớp và giữ kích thước array trong type. Hãy đọc std::erase_if như lời hứa chính xác; runtime precondition vẫn do lập trình viên chịu trách nhiệm.
4. Cú pháp tối thiểu
bool prefix = text.starts_with("log:");
std::erase_if(values, predicate);5. Cách nó hoạt động
Chương trình đưa vào dạng nhỏ nhất cần thiết của
std::erase_if.Nó áp dụng tính năng lên dữ liệu cố định và giữ owner cần thiết trong scope.
Nó in một kết quả để đối chiếu trực tiếp với source.
6. Lỗi thường gặp
containsthuộc C++20 với associative container chứ chưa phảistd::string::contains; stringcontainsxuất hiện sau nên phải giữ ranh giới phiên bản.Hãy kiểm tra cả header, mức hỗ trợ thư viện C++20, lifetime và kiểu được suy luận.
7. Khi nào nên dùng
Nên dùng khi named operation khớp đúng ý định và làm code dễ đọc.
Tránh dùng khi bạn nhắm standard library cũ hoặc cần chính sách match/xóa khác.
8. Ví dụ đơn giản
Chương trình kiểm tra chuỗi, truy vấn set, xóa số chẵn khỏi vector và tạo fixed array. Tệp .cpp không nhận input nên kết quả dễ lặp lại.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp20/33_string_helpers_erase_if_to_array/main.cpp
// Day 33: starts_with, ends_with, contains, erase_if, and to_array
#include <algorithm>
#include <array>
#include <iostream>
#include <set>
#include <string>
#include <vector>
int main() {
std::string text = "log:ready.txt";
std::set<int> ids{2, 4, 8};
std::vector values{1, 2, 3, 4};
int raw[]{7, 8, 9};
auto fixed = std::to_array(raw);
std::erase_if(values, [](int x) { return x % 2 == 0; });
std::cout << std::boolalpha;
std::cout << text.starts_with("log:") << ' ' << text.ends_with(".txt") << '\n';
std::cout << "contains 4 = " << ids.contains(4) << '\n';
std::cout << "remaining = " << values[0] << ',' << values[1] << '\n';
std::cout << "array size = " << fixed.size() << '\n';
}
9. Điều cần nhớ
std::erase_ifdiễn đạt ý tưởng C++20 trung tâm của ngày này.Ví dụ cô lập một hành vi bằng dữ liệu cố định.
Compiler check không thay thế suy luận về lifetime và runtime.
Ưu tiên interface nhỏ nhất nói đúng yêu cầu thật.
10. Câu hỏi tự kiểm tra
Dễ — Nhiệm vụ chính của
std::erase_iftrong ví dụ tối thiểu là gì?Trung bình — Sau khi
std::erase_ifxóa số chẵn, giá trị nào còn lại và theo thứ tự nào?Khó — Vì sao thay
set.contains(key)bằngtext.contains(fragment)sẽ vượt ranh giới C++20 của khóa học?