STL算法的谓词

时间:2013-04-11 05:49:17

标签: c++

我有以下问题:

find_if(s.begin(), s.end(), isalpha);

是一个库字符串。当我尝试使用isalpha(在“cctype”标题中)时,它说,“类型不匹配”。问题是isalpha接受一个int并返回一个int:int isalpha(int)

我通过声明另一个函数来解决它:

bool IsAlpha(char c) {
  return isalpha(c);
}

但是,有没有更好的方法呢?我希望更好的代码清晰度和简单,没有声明这个“包装”功能。

谢谢!

4 个答案:

答案 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

的仿函数的优点