[英]Predicate for STL algorithms
我有以下問題:
find_if(s.begin(), s.end(), isalpha);
s是一個庫字符串。 當我嘗試使用isalpha(在“ cctype”標頭中)時,提示“類型不匹配”。 問題是isalpha接受一個int並返回一個int:int isalpha(int)
我通過聲明另一個函數解決了這個問題:
bool IsAlpha(char c) {
return isalpha(c);
}
但是,還有更好的方法嗎? 我希望更好的代碼清晰度和簡單性,而無需聲明此“包裝”功能。
謝謝!
我想“正確的” C ++方法是使用在語言環境中定義的isalpha
:
std::find_if(
s.begin(),
s.end(),
[](char c) { return std::isalpha(c, std::locale()); }
);
可能有些冗長。
您的解決方案對我來說很好。 除了它有一個非常常見的錯誤
bool IsAlpha(char c) {
return isalpha(c);
}
應該
bool IsAlpha(char c) {
return isalpha((unsigned char)c);
}
僅針對無符號char值(通常為0到255)和EOF(通常為-1)定義isalpha。 嚴格來說,將其他任何負值傳遞給isalpha都是不確定的。 但是,在實踐中您會發現(假設您的char類型是帶符號的)如果給例程賦予代碼255,則最終將-1值傳遞給isalpha,而isalpha總是返回false。
使用函子怎么樣?
struct IsAlpha {
bool operator() (char c) const { return /* isAlpha logic here */; }
};
//...
find_if(begin, end, IsAlpha());
在這里看看將函子與stl算法一起使用的優勢
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.