在 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));
在哪里
elementInfo
是 std::vector< struct MaxWinPerElementInfo >
和 paytable
是 std::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 中使用谓词的主要内容,如果未能解决你的问题,请参考以下文章