如何创建自定义查找功能?

时间:2015-10-28 12:49:03

标签: c++ string algorithm lambda

我想创建一个find函数,它根据给定的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)

3 个答案:

答案 0 :(得分:4)

您可以创建lambda并捕获lambda捕获列表中的char mychar = 'A'; // ... auto findfn = [mychar](pair<char, char> x) -> bool { return x.second == mychar; }; 变量:

reg_date varchar(20)

答案 1 :(得分: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的方法更为通用。

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