C# · 12月 20, 2021

c/c++ lambda 表达式使用实例分析

lambda 表达式 介绍

问题:假设有个需求是,在vector找出所有长度大于等于4的元素。标准库find_if函数的第三参数是函数指针,但是这个函数指针指向的函数只能接受一个参数,这个参数是vector里的元素。这时问题就来了,长度4无法作为参数传递,

肿么办???

解决办法:使用lambda。

lambda简单介绍:多了一个捕获列表的无名内联函数。

[capture list] (parameter list) -> return type { function body }

捕获列表,参数列表(可省略),返回值类型(可省略),函数体。

具体做法:把问题中的长度4作为捕获列表,把vector里的元素作为参数列表,传递个lambda表达式,就解决了上述问题,

完美!!!

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

//删除重复的元素

void delDups(vector &svec){

sort(svec.begin(),svec.end());

auto end_u = unique(svec.begin(),svec.end());

svec.erase(end_u,svec.end());

}

//自定义的排序规则

bool shorter(const string s1,const string s2){

return s1.size() < s2.size();

}

//用lambda作为参数

void bigger(vector &words,

vector::size_type sz){

delDups(words);

//用lambda作为第三个参数

stable_sort(words.begin(),words.end(),

[](const string &s1,const string &s2){

return s1.size() < s2.size();

});

//把长度参数sz作为捕获列表,传递给lambda表达式

auto idx = find_if(words.begin(),

[sz](const string &s){

return s.size() >= sz;

});

auto cnt = words.end() – idx;

cout << cnt <= " << sz << endl;

for_each(idx,[](const string &s){

cout << s << " ";

});

cout << endl;

}

int main(){

//test1 自定义排序算法

/*

vector svec{“the”,”quick”,”red”,”fox”,”jumps”,

“over”,”the”,”slow”,”turtle”};

delDups(svec);

//先按长度排序,长度相同的,再用字典顺序排序

stable_sort(svec.begin(),svec.end(),shorter);

for(const auto &s : svec){

cout << s << " ";

}

cout << endl;

*/

//test2 用lambda作为参数

vector svec{“the”,”turtle”};

bigger(svec,4);

}