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

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 文件创建的自定义单元格?

如何在带有打字稿的反应功能组件中定义自定义道具?

如何创建自定义自动完成功能,如内置自动完成功能?

如何在 Django 中基于全文搜索功能 SearchRank 创建自定义排名?

如何使用 Core Animation 创建自定义缓动功能?