c/c++ lambda 表达式 介绍
程序员文章站
2022-10-05 11:13:53
lambda 表达式 介绍 问题:假设有个需求是,在vector\找出所有长度大于等于4的元素。标准库find_if函数的第三参数是函数指针,但是这个函数指针指向的函数只能接受一个参数,这个参数是vector\里的元素。这时问题就来了,长度4无法作为参数传递, 肿么办??? 解决办法:使用lambd ......
lambda 表达式 介绍
问题:假设有个需求是,在vector<string>找出所有长度大于等于4的元素。标准库find_if函数的第三参数是函数指针,但是这个函数指针指向的函数只能接受一个参数,这个参数是vector<string>里的元素。这时问题就来了,长度4无法作为参数传递,
肿么办???
解决办法:使用lambda。
lambda简单介绍:多了一个捕获列表的无名内联函数。
[capture list] (parameter list) -> return type { function body }
捕获列表,参数列表(可省略),返回值类型(可省略),函数体。
具体做法:把问题中的长度4作为捕获列表,把vector<string>里的元素作为参数列表,传递个lambda表达式,就解决了上述问题,
完美!!!
#include <iostream> #include <array> #include <vector> #include <algorithm> #include <list> #include <deque> #include <numeric> #include <forward_list> using namespace std; //删除重复的元素 void deldups(vector<string> &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<string> &words, vector<string>::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(),words.end(), [sz](const string &s){ return s.size() >= sz; }); auto cnt = words.end() - idx; cout << cnt << " word's length >= " << sz << endl; for_each(idx, words.end(),[](const string &s){ cout << s << " "; }); cout << endl; } int main(){ //test1 自定义排序算法 /* vector<string> svec{"the","quick","red","fox","jumps", "over", "the","slow","red","turtle"}; deldups(svec); //先按长度排序,长度相同的,再用字典顺序排序 stable_sort(svec.begin(),svec.end(),shorter); for(const auto &s : svec){ cout << s << " "; } cout << endl; */ //test2 用lambda作为参数 vector<string> svec{"the","quick","red","fox","jumps", "over", "the","slow","red","turtle"}; bigger(svec, 4); }