在 find_if 中使用谓词

Posted

技术标签:

【中文标题】在 find_if 中使用谓词【英文标题】:Using predicate in find_if 【发布时间】:2014-03-26 12:03:41 【问题描述】:

我有一个这样的结构。

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,因为这是旧代码。

我在这里缺少什么?任何建议都会很有帮助。

【问题讨论】:

【参考方案1】:

你的类没有接受 std::string 类型参数的转换构造函数。所以编译器会发出错误解析表达式

MaxWinPerElementInfo( paytable)

您可以使用 lambda 表达式代替函数对象。例如

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

如果您可能不使用 lambda 表达式,那么您可以在结构内部定义一个函数对象。例如

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 ) );

使用内部结构允许您通过使用外部结构的各种数据成员来定义多个搜索条件。

【讨论】:

感谢示例 lambda【参考方案2】:
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) );

【讨论】:

【参考方案3】:

您需要添加一个构造函数,该构造函数接受一个字符串并将其放入 paytableName。否则,您无法在 find_if() 调用中尝试从字符串创建 MaxWinPerElementInfo。

【讨论】:

以上是关于在 find_if 中使用谓词的主要内容,如果未能解决你的问题,请参考以下文章

c++ find_if 找不到谓词

具有多个谓词的 C++11 算法

在实例方法中使用 find_if

如何使用 find_if 在给定的对向量中查找元素

find_if 中具有多个参数的 Lambda

为啥像这样使用 find_if 会失败?