初始化要作为谓词传递到C++中std::find_if的lambda函数



我试图初始化一个lambda函数,然后将其作为谓词传递给std::find_if,但收到以下编译器错误"表达式不能用作函数";。

那么,如何首先将lambda初始化为类型自动变量,并将其作为谓词函数传递给std::find_if这样的算法呢?

#include <iostream>
#include <vector>
#include <algorithm>


int main()
{
std::vector<std::string> vec ={"this", "is", "a", "test", "to",
"see","if", "this", "works", "to", "this", "if"};

auto elimDups_lambda
{
[&vec]()
{
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
return vec;
}
};

for(auto& iter_vec:elimDups_lambda())
std::cout<<iter_vec<<std::endl;


auto lambda_size
{
[&vec](size_t x)
{
for(auto& iter_vec:vec)
{
if(iter_vec.size()==x)
return true;
else if(iter_vec >*vec.end())
return false;
}
}
};


size_t string_size =0;
std::cin>>string_size;

std::vector<std::string>::iterator find_word =
std::find_if(vec.begin(), vec.end(), lambda_size(string_size));

std::cout<<*find_word<<std::endl;

return 0;
}

谢谢。

为了定义一个包含lambda的变量,可以使用类似的语法:

auto lambda_var = 
[&vec]()
{
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
return vec;
};

要在调用std::find_if时使用它,请将lambda_var(或包含所需lambda的变量的名称(作为第三个参数传递给std::find_if

在您的代码中,elimDups_lambdalambda_size没有被正确地定义为包含lambda的变量(如果这确实是您想要实现的(。

使用表达式

lambda_size(string_size)

调用lambda函数,然后返回的bool结果将用作std::find_if的谓词。

这当然不会很有效。

你可以用两种方法来解决这个问题:

  1. 捕获lambda中的string_size;或

  2. 使lambda返回另一个lambda进行大小检查:

    auto lambda_size = [&vec](size_t size)
    {
    return [size](std::string const& word)
    {
    return word.length() == size;
    }
    }
    

还要注意我是如何更改lambda中的逻辑进行比较的。您的比较可能意味着您取消引用向量的end()迭代器,这是不允许的。还有一条路径,lambda实际上不返回任何内容。

lambda内部的这两个问题都会导致未定义的行为

最新更新