我试图初始化一个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_lambda
和lambda_size
没有被正确地定义为包含lambda的变量(如果这确实是您想要实现的(。
使用表达式
lambda_size(string_size)
调用lambda函数,然后返回的bool
结果将用作std::find_if
的谓词。
这当然不会很有效。
你可以用两种方法来解决这个问题:
捕获lambda中的
string_size
;或使lambda返回另一个lambda进行大小检查:
auto lambda_size = [&vec](size_t size) { return [size](std::string const& word) { return word.length() == size; } }
还要注意我是如何更改lambda中的逻辑进行比较的。您的比较可能意味着您取消引用向量的end()
迭代器,这是不允许的。还有一条路径,lambda实际上不返回任何内容。
lambda内部的这两个问题都会导致未定义的行为。