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);
}