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)