【问题标题】:Using predicate in find_if在 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,因为这是旧代码。

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

【问题讨论】:

    标签: c++ string algorithm


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 2018-07-26
        相关资源
        最近更新 更多