---
# System prepended metadata

title: c++的lambda

---

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)

