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 << " word's length >= " << 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); } (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|