如何创建自定义查找功能?
Posted
技术标签:
【中文标题】如何创建自定义查找功能?【英文标题】:How to create a custom find function? 【发布时间】:2015-10-28 12:49:03 【问题描述】:我想创建一个查找函数,该函数根据给定的 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)
【问题讨论】:
等等你不能改变 lambda?为什么不?请至少使用伪代码演示您要执行的操作。 在发布这个问题之前,我不知道我们可以使用 lambda 的各种方式。 ([]中的论点) 你不能用 find_if 代替 find 吗?如果你这样做,效果很好。 在使用find_if
的时候不用担心比较功能中mychar
的范围吗?
使用我提供的解决方案:coliru.stacked-crooked.com/a/0767e5f71e82d885
【参考方案1】:
您可以创建一个 lambda 并在 lambda 捕获列表中捕获 mychar
变量:
char mychar = 'A';
// ...
auto findfn = [mychar](pair<char, char> x) -> bool return x.second == mychar; ;
【讨论】:
谢谢。有什么方法可以将mychar
发送到函数?
@AnukulSangwan 你在说什么还不清楚。您可以编辑您的问题以显示您希望调用代码的外观吗?可以是伪代码。
@vincentp 如果您通过引用捕获mychar
,那么它甚至会响应mychar
中的更改,我理解OP 想要的。【参考方案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
的方法更通用。
【讨论】:
【参考方案3】:您可以编写一个接受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'));
【讨论】:
以上是关于如何创建自定义查找功能?的主要内容,如果未能解决你的问题,请参考以下文章
在 PhP、Wordpress 和 MySQL 中,查找最近的位置的功能不适用于自定义表
如何将 SwipeCellKit 的自定义滑动功能用于从 .xib 文件创建的自定义单元格?