Viết hàm lấy char
và trả về true
nếu bạn muốn xóa ký tự đó hoặc false
nếu bạn muốn giữ nó:
bool my_predicate(char c);
Sau đó, sử dụng thuật toán std::remove_if
để xóa các ký tự không mong muốn khỏi chuỗi:
std::string s = "my data";
s.erase(std::remove_if(s.begin(), s.end(), my_predicate), s.end());
Tùy thuộc vào yêu cầu của bạn, bạn có thể sử dụng một trong các vị từ Thư viện chuẩn, như std::isalnum
, thay vì viết vị ngữ của riêng bạn (bạn nói rằng bạn cần khớp các ký tự chữ và số, vì vậy có lẽ điều này không phù hợp với những gì bạn cần ).
Nếu bạn muốn sử dụng chức năng Thư viện tiêu chuẩn std::isalnum
, bạn sẽ cần một nhóm truyền để phân tán giữa chức năng std::isalnum
trong tiêu đề Thư viện chuẩn C <cctype>
(là tiêu đề bạn muốn sử dụng) và std::isalnum
trong tiêu đề Thư viện chuẩn C++ <locale>
đó không phải là cái bạn muốn sử dụng, trừ khi bạn muốn thực hiện xử lý chuỗi cụ thể theo miền địa phương):
s.erase(std::remove_if(s.begin(), s.end(), (int(*)(int))std::isalnum), s.end());
Điều này hoạt động tốt như nhau với bất kỳ vùng chứa trình tự nào (bao gồm std::string
, std::vector
và std::deque
). Thành ngữ này thường được gọi là thành ngữ “xóa/xóa”. Thuật toán std::remove_if
cũng sẽ hoạt động với các mảng thông thường. std::remove_if
chỉ thực hiện một lần duy nhất trong chuỗi, do đó, nó có độ phức tạp thời gian tuyến tính.