STL算法的谓词

Predicate for STL algorithms

本文关键字:谓词 算法 STL      更新时间:2023-10-16

我有以下问题:

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

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

我通过声明另一个函数解决了这个问题:

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

然而,有没有更好的方法来做到这一点?我希望代码更清晰&简单,不需要声明这个"包装器"函数。

谢谢!

我认为"适当的"c++方法是使用在locale中定义的isalpha:

std::find_if(
    s.begin(), 
    s.end(), 
    [](char c) { return std::isalpha(c, std::locale()); }
);

可能有点啰嗦。

唯一的方法,我能想象的是,你用using namespace std,因为你写的是find_if,而不是std::find_if,在这种情况下,你有以下错误生活的例子。您不应该编写包装器,您可以简单地使用::isalpha Live示例,或者您可以将第二个par绑定到默认区域设置,如这里

我看你的解决方案不错。除了它有一个非常常见的错误

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

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

isalpha仅为unsigned char值(通常为0到255)和EOF(通常为-1)定义。严格来说,将任何其他负值传递给isalpha都是未定义的。然而,在实践中你会发现(假设你的char类型是有符号的),如果你给你的例程提供代码为255的字符,你将最终将值-1传递给isalpha,它将始终返回false。

如何使用函子?

    struct IsAlpha {
      bool operator() (char c) const { return /* isAlpha logic here */; }         
    };
    //... 
    find_if(begin, end, IsAlpha());

看一下在stl算法中使用函子的优点