我对C ++中的STL很新,即使在几小时后也无法获得正确的输出。
int main()
{
std::string str = "Hello8$World";
replace(str.begin(), str.end(), ::isdigit, " ");
replace(str.begin(), str.end(), ::ispunct, " ");
return 0;
}
如果上述方法有效,我会非常高兴,但事实并非如此。
答案 0 :(得分:3)
使用 lambda函数的所有内容,更多 C ++ 14 -ish:
#include <iostream>
#include <string>
#include <algorithm>
int main() {
std::string str = "Hello8$World";
std::replace_if(str.begin(), str.end(), [](auto ch) {
return ::isdigit(ch) || ::ispunct(ch);
}, ' ');
std::cout << str << std::endl;
return 0;
}
这样你就不会在字符串上迭代两次。
答案 1 :(得分:1)
您使用的功能错误。 std::replace
为两个迭代器提供旧值和新值。 std::replace_if
为两个迭代器提供一个函数和一个新值。您还需要使用' '
而不是" "
作为迭代器指向的字符串类型是char而不是字符串。如果将其更改为
replace_if(str.begin(),str.end(),::isdigit,' ');
replace_if(str.begin(),str.end(),::ispunct,' ');
一切正常(Live Example)。
答案 2 :(得分:1)
在这种情况下,您需要使用replace_if
函数,因为您正在检查条件。 Cppreference对此有一个很好的解释。 replace_if
的最后两个参数是UnaryPredicate(一个接受一个参数并返回true
或false
的函数)和迭代器中每个位置的基础对象类型(用于字符串)是char
,而不是字符串。)
int main()
{
std::string str="Hello8$World";
std::cout << str << std::endl;
std::replace_if(str.begin(), str.end(), ::isdigit, ' ');
std::replace_if(str.begin(), str.end(), ::ispunct, ' ');
std::cout << str << std::endl;
return 0;
}
答案 3 :(得分:1)
使用谓词的函数名称为std::replace_if
,您想要替换字符,因此' '
而不是" "
- 这是char const*
:
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string str = "Hello8$World";
std::replace_if(str.begin(), str.end(), ::isdigit, ' ');
std::replace_if(str.begin(), str.end(), ::ispunct, ' ');
std::cout << str << std::endl;
return 0;
}