在find_if中使用谓词

时间:2014-03-26 12:03:41

标签: c++ string algorithm

我有这样的结构。

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

我想找到与paytableName匹配的元素。为此我计划使用带有谓词函数的std::find_if

我在struct MaxWinPerElementInfo as,

中声明了函数对象
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 个答案:

答案 0 :(得分: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) );

答案 1 :(得分: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 ) );

使用内部结构,您可以使用外部结构的各种数据成员定义几个搜索条件。

答案 2 :(得分:2)

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