STL算法的谓词
Predicate for STL algorithms
我有以下问题:
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算法中使用函子的优点
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 为 C++11 算法组合多个谓词
- 如何在算法中使用谓词函数find_if?
- 什么 STL 算法可以确定容器中的一个项目是否满足谓词?
- 为什么指向非静态成员函数的指针不能用作标准库算法的一元谓词
- 是否允许标准库算法复制谓词参数
- 为什么要区分泛型算法的谓词和非谓词版本
- 如何从传递给STL算法的谓词中获取元素的索引
- 使用带有绑定的boost字符串算法谓词
- std::list指针上排序算法的STL谓词
- 为什么序列运算算法谓词是通过复制传递的
- 在c++中通过引用传递std算法谓词
- STL算法的谓词
- 如何将谓词传递给算法