我有以下问题:
find_if(s.begin(), s.end(), isalpha);
是一个库字符串。当我尝试使用isalpha(在“cctype”标题中)时,它说,“类型不匹配”。问题是isalpha接受一个int并返回一个int:int isalpha(int)
我通过声明另一个函数来解决它:
bool IsAlpha(char c) {
return isalpha(c);
}
但是,有没有更好的方法呢?我希望更好的代码清晰度和简单,没有声明这个“包装”功能。
谢谢!
答案 0 :(得分:2)
我认为'正确'的C ++方法是使用语言环境中定义的isalpha
:
std::find_if(
s.begin(),
s.end(),
[](char c) { return std::isalpha(c, std::locale()); }
);
可能有点冗长。
答案 1 :(得分:1)
我能想象的唯一方法是,您使用using namespace std
,因为您编写了find_if
,而不是std::find_if
,在这种情况下,您有以下错误
Live example。您不能编写包装器,只需使用::isalpha
Live example或者您可以将第二个par绑定到默认语言环境,例如here
答案 2 :(得分:0)
您的解决方案对我来说很好。除了它有一个非常常见的错误
bool IsAlpha(char c) {
return isalpha(c);
}
应该是
bool IsAlpha(char c) {
return isalpha((unsigned char)c);
}
isalpha仅定义为无符号字符值(通常为0到255)和EOF(通常为-1)。严格地说,将任何其他负值传递给isalpha是不确定的。然而,你在实践中会发现(假设你的char类型是签名的)如果你给你的例程代码255的字符,你将最终将值-1传递给isalpha,它总是返回false。
答案 3 :(得分:0)
如何使用仿函数?
struct IsAlpha {
bool operator() (char c) const { return /* isAlpha logic here */; }
};
//...
find_if(begin, end, IsAlpha());
了解使用stl算法here
的仿函数的优点