更新时间:2023-02-19 12:48:20
编写一个需要 char
code> true 如果要删除该字符,或 false
,如果要保留:
Write a function that takes a char
and returns true
if you want to remove that character or false
if you want to keep it:
bool my_predicate(char c);
然后使用 std :: remove_if
算法从字符串中删除不需要的字符:
Then use the std::remove_if
algorithm to remove the unwanted characters from the string:
std::string s = "my data";
s.erase(std::remove_if(s.begin(), s.end(), my_predicate), s.end());
根据您的要求,您可以使用标准库谓词之一,例如 std :: isalnum
,而不是写你自己的谓词(你说你需要匹配字母数字字符和空格,所以也许这不完全适合你需要的)。
Depending on your requirements, you may be able to use one of the Standard Library predicates, like std::isalnum
, instead of writing your own predicate (you said you needed to match alphanumeric characters and spaces, so perhaps this doesn't exactly fit what you need).
如果你想使用标准库 std :: isalnum
函数,你需要一个cast来消除< cctype> (这是您要使用的)中的c $ c> std :: isalnum 在C ++标准库头中的 std :: isalnum
< locale>
(这不是你想要的使用,除非您要执行特定于语言环境的字符串处理):
If you want to use the Standard Library std::isalnum
function, you will need a cast to disambiguate between the std::isalnum
function in the C Standard Library header <cctype>
(which is the one you want to use) and the std::isalnum
in the C++ Standard Library header <locale>
(which is not the one you want to use, unless you want to perform locale-specific string processing):
s.erase(std::remove_if(s.begin(), s.end(), (int(*)(int))std::isalnum), s.end());
这对任何序列容器同样有效(包括 std :: string
, std :: vector
和 std :: deque
)。这个成语通常被称为擦除/移除成语。 std :: remove_if
算法也适用于普通数组。 std :: remove_if
只对序列进行一次遍历,因此它具有线性时间复杂性。
This works equally well with any of the sequence containers (including std::string
, std::vector
and std::deque
). This idiom is commonly referred to as the "erase/remove" idiom. The std::remove_if
algorithm will also work with ordinary arrays. The std::remove_if
makes only a single pass over the sequence, so it has linear time complexity.