2014-03-26 114 views
0

我有一個像這樣的結構。在find_if中使用謂詞

struct MaxWinPerElementInfo 
{ 
    std::string paytableName; 
    std::string elementName; 
    long long elementCredits; 
    bool  multiplierRequired; 
}; 

我想找到與paytableName匹配的元素。爲此,我計劃使用帶謂詞功能的std::find_if

我宣佈struct MaxWinPerElementInfo作爲內部函數對象,

bool operator() (const MaxWinPerElementInfo &elementInfo) const 
{ 
    return paytableName == elementInfo.paytableName; 
} 

現在,我試圖通過調用搜索元素,

std::find_if(elementInfo.begin(), elementInfo.end(), MaxWinPerElementInfo(paytable));

其中 elementInfostd::vector< struct MaxWinPerElementInfo >paytablestd::string

爲此,我正在錯誤,no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const MaxWinPerElementInfo&’

我不能使用C++ 11,因爲這是一個遺留代碼。

我在這裏失蹤了什麼?任何建議都會非常有幫助。

回答

3
std::find_if(elementInfo.begin(), elementInfo.end(), 
    MaxWinPerElementInfo(paytable)); 

您正試圖通過傳遞一個字符串來構造MaxWinPerElementInfo。你有一個構造函數接受一個字符串?我猜不是編譯器試圖調用複製構造函數,該構造函數採用const MaxWinPerElementInfo引用。如果沒有定義構造函數接受單個參數,那麼編譯器將恢復到它知道的唯一一個:複製構造函數。

既然你有一個結構和成員是公共的,我會建議在一個函數對象的類的外部實現這個。

struct MaxWinPerElementInfoPayTablePredicate 
{ 
    MaxWinPerElementInfoPayTablePredicate(const std::string& _paytableName) : 
     paytableName(_paytableName) {} 

    bool operator() (const MaxWinPerElementInfo &elementInfo) const 
    { 
     return paytableName == elementInfo.paytableName; 
    } 

    std::string paytableName; 
} 

然後調用它像這樣:

std::find_if(elementInfo.begin(), elementInfo.end(), 
    MaxWinPerElementInfoPayTablePredicate(paytable)); 
2

您需要添加一個構造函數,需要一個字符串,並將其放入paytableName。否則,您不能像調用find_if()調用時那樣從字符串創建MaxWinPerElementInfo。

3

您的類沒有轉換構造函數,它接受std :: string類型的參數。因此,編譯器發出解析表達式的錯誤

MaxWinPerElementInfo(paytable) 

您可以使用lambda表達式而不是功能對象。例如

std::find_if(elementInfo.begin(), elementInfo.end(), 
       [&] (const MaxWinPerElementInfo &elementInfo ) 
       { 
       return paytableName == elementInfo.paytableName; 
       }); 

如果您不想使用lambda表達式,那麼您可以在structire中定義一個功能對象。例如

struct MaxWinPerElementInfo 
{ 
    std::string paytableName; 
    std::string elementName; 
    long long elementCredits; 
    bool  multiplierRequired; 

    struct FindByPaytableName 
    { 
     FindByPaytableName(const std::string &paytableName) : paytableName(paytableName) {} 
     std::string paytableName; 
     bool operator() (const MaxWinPerElementInfo &elementInfo) const 
     { 
      return paytableName == elementInfo.paytableName; 
     } 
    }; 
}; 


std::find_if(elementInfo.begin(), elementInfo.end(), 
       MaxWinPerElementInfo::FindByPaytableName(paytableName)); 

使用內部結構允許您通過使用外部結構的各種數據成員來定義多個搜索條件。

+0

@Eric Fortin謝謝。我更新了我的帖子。 –