2015-10-28 39 views
1

我想创建一个查找函数,它根据给定的lambda表达式工作,并匹配给定的字符(其变化)。 我尝试使用lambda表达式,但lambda表达式中的匹配是一个常量字符。根据我的意愿,我不能改变lambda表达式。我有一个vector < pair <char, char> > r。 我想要做的是,如何创建自定义查找功能?

运行此矢量,看看是否有任何r[i].second匹配我的给定的字符。在这里,给定的字符是字符串的一部分,因此会随着迭代而变化,所以我无法将其修正到lambda表达式中,我也不能将参数传递给lambda表达式来解决这个问题。

bool findfn (pair <char, char> x) 
{ 
    return x.second == mychar // I want to pass mychar as argument 
} 

一种可能性是使用lambda表达式,这在vincentp的答案中有解释。我们是否也可以使用上面显示的findfn来做到这一点?调用代码如下所示:

find(r.begin(), r.end(), findfn)

+0

等待你不能改变的拉姆达?为什么不?请至少伪造你想要做的事情。 – NathanOliver

+0

在发布这个问题之前,我不知道我们可以使用lambda的各种方式。 ([]中的参数) – anukul

+0

你不能使用find_if代替find吗?如果你这样做工作正常。 – vincentp

回答

4

您可以创建一个lambda并捕获在lambda捕获列表中mychar变量:

char mychar = 'A'; 
// ... 
auto findfn = [mychar](pair<char, char> x) -> bool { return x.second == mychar; }; 
+0

谢谢。任何方式发送'mychar'到函数? – anukul

+0

@AnukulSangwan你说的是相当不清楚的。你可以编辑你的问题,以显示你希望调用代码看起来如何?它可以是伪代码。 – Angew

+0

@vincentp如果你通过引用捕获'mychar',那么它甚至会响应'mychar'中的变化,我理解OP的想法。 – Walter

2

如果我理解正确的话,那么std::bind能解决您的问题。它基本上采用一个函数,将某些值绑定到某些参数,并返回一个期望参数较少的函数。 例子:

#include <functional> 
//... 
auto findfn = [](pair<char,char> x, char mychar) { return x.second == mychar }; 
char yourchar = 'a'; 
find_if(r.begin(), r.end(), std::bind(findfn, std::placeholder::_1, yourchar)); 

编辑:在我的防守,你说,你想传递一个附加参数。如果你可以使用捕获列表,这当然会更容易,但std::bind的方法更一般。

1

你可以写一个接受mychar,并返回使用mychar lambda函数的函数:

std::function<bool(std::pair<char, char>)> findFor(char mychar) 
{ 
    return [mychar](std::pair<char, char> x) { return x.second == mychar; }; 
} 

it = find_if(r.begin(), r.end(), findFor('a'));