c++的lambda
===
#include <functional>
#include <iostream>
### 原本要這樣寫
int add(itn a,int b){
return a+b;
}
int main()
{
cout<<add(1,2)<<endl;
// output: 3
}
### 用了lambda之後 變這樣
int main()
{
//下面這個function的內容跟上面的add是一模一樣的 差別只在他沒有名子
//(可以用f1呼叫是因為他用 = 把這個函式 當成一個變數 assign到f1 )
auto f1 = [](int x, int y) { return x + y; };
//因為前面有 auto f1 = ...
//所以現在可以用f1去呼叫這個函式了
cout << f1(2, 3) << endl;
}
auto的補充:
在 C++11 裡 ,對於有被明確初始化的變數,我們可以使用 auto 這個新的變數類型,讓編譯器自動判斷其變數的類型
### 不用auto的話就要這樣寫
int main(){
function<int(int, int)> f2 = [](int x, int y) { return x + y; };
cout << f2(3, 4) << endl;
}
//總結:
[](int x, int y) { return x + y; };
等價於
int add(int a,int b){
return a+b;
}
(只是沒有名子 所以要用的時候還是要用auto f1 = 才能自己呼叫他)
你如果要用c++(不推)
寫作業可以這樣寫:
template<typename T>
vector<T> select_T(const vector<T>& inVec, function<bool(const T&)> predicate)
{
vector<T> result;
copy_if(inVec.begin(), inVec.end(), back_inserter(result), predicate);
return result;
}
int main(){
std::vector<int> mVec = {1,4,7,8,9,0};
// filter out values > 5
auto gtFive = select_T<int>(mVec, [](auto a) {return (a > 5); }
);
}
//select_T是一個函式
它的第一個參數放一個vector
它的第二個參數放一個函式(他這邊直接放一個匿名函式在第二個參數的位置上)
根據我剛剛的google
select_T收這2個參數之後會做這件事情
bool check_larger_than_five(int num){
if(num>5){
return true;
}else{
return false;
}
}
vector<int> answer;
for(int i=0;i<mVec.size();i++){
if(check_larger_than_five(mVec[i]==true){
answer.push(mVec[i]);
}
}
然後回傳這個新做好的answer
##### 跟下面的結果是一樣的
bool check_larger_than_five(int num){
if(num>5){
return true;
}else{
return false;
}
}
int main(){
std::vector<int> mVec = {1,4,7,8,9,0};
// filter out values > 5
auto gtFive = select_T<int>(mVec, check_larger_than_five );
}
以下是c++版的作業
https://replit.com/join/mecaucnw-jowiill
### code
#include <iostream>
#include<vector>
#include <functional>
#include <iostream>
using namespace std;
template<typename T>
std::vector<T> select_T(const std::vector<T>& inVec, std::function<bool(const T&)> predicate)
{
std::vector<T> result;
copy_if(inVec.begin(), inVec.end(), back_inserter(result), predicate);
return result;
}
int main() {
std::vector<int> mVec = {1,4,7,8,9,0};
// filter out values > 5
auto gtFive = select_T<int>(mVec, [](auto a) {return (a > 5); });
//以下是測試
for(auto i:gtFive){
cout<<i<<endl;
}
}
python版:
//濾出奇數
a = [1,2,3,4,5,6,7,8,9,10]
print(a)
b = list(filter(lambda x: x%2==1 , a))
print(b)