簡體   English   中英

STL算法的謂詞

[英]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()); }
);

可能有些冗長。

我可以想象的唯一方法是, using namespace std ,因為您編寫的是find_if而不是std::find_if ,在這種情況下,您將遇到以下錯誤Live示例 您不必編寫包裝器,可以只使用::isalpha Live示例 ,也可以將第二個par綁定到默認語言環境,例如此處

您的解決方案對我來說很好。 除了它有一個非常常見的錯誤

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM