【问题标题】: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

标签: c++ string algorithm lambda


【解决方案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'));
    

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 2016-03-07
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多