lambda

Prerequisites:

函式指標

auto與函式

lambda又稱匿名函式,也就是沒有名字的函式。

語法介紹

[]()->Int{
	return 0;
}

[] 獲取外部的變數值或參考

() 函式參數

-> 函式傳回值型態,若為void可以不寫,

{} 函式主體

[]傳入外部變數值或參考

auto與函式要先看過才看的懂以下程式碼。

傳變數值

以下程式碼是把外部變數name透過[name]的方式,傳入lambda。

若要傳多個,用逗號。

注意!傳值的方式是不能修改外部變數。

語法

[name, age, ...]
1
2
3
4
5
6
7
8
9
int main() {
  string name = "Mary";
  int age = 20;
  auto f1 = [name](){
    cout << "name = " << name << endl;
  };
  f1();
  return 0;
}
name = Mary

傳變數參考

傳參考是可以修改變數的值

若要傳多個,用逗號。

語法

[&name, &age, ...]
1
2
3
4
5
6
7
8
9
int main() {
  string name = "Mary";
  auto f1 = [&name](){
    name = "Bill";
    cout << "name = " << name << endl;
  };
  f1();
  return 0;
}
name = Bill

傳值=

若lambda中有用到外部變數,就會直接以值的方式把有用到的外部變數傳入lambda

語法

[=]
1
2
3
4
5
6
7
8
9
10
int main() {
  string name = "Mary";
  int age = 18;
  auto f1 = [=](){
    cout << "name = " << name << endl;
    cout << "age = " << age << endl;
  };
  f1();
  return 0;
}
name = Mary
age = 18

傳參考&

若lambda中有用到外部變數,就會直接以參考的方式把有用到的外部變數傳入lambda

傳參考是可以修改變數的值

語法

[&]
1
2
3
4
5
6
7
8
9
10
11
12
int main() {
  string name = "Mary";
  int age = 18;
  auto f1 = [&](){
    name = "Bill";
    age = 30;
    cout << "name = " << name << endl;
    cout << "age = " << age << endl;
  };
  f1();
  return 0;
}
name = Bill
age = 30

混合傳

語法

[&, name]

除了name變數是傳值的方式,其它lambda中有用到的變數一律傳參考的方式代入。

1
2
3
4
5
6
7
8
9
10
11
int main() {
  string name = "Mary";
  int age = 18;
  auto f1 = [&, name](){
    age = 30;
    cout << "name = " << name << endl;
    cout << "age = " << age << endl;
  };
  f1();
  return 0;
}
name = Mary
age = 30

語法

[=, &name]

除了name變數是傳參考的方式,其它lambda中有用到的變數一律傳值的方式代入。

1
2
3
4
5
6
7
8
9
10
11
int main() {
  string name = "Mary";
  int age = 18;
  auto f1 = [=, &name](){
    name = "Tom";
    cout << "name = " << name << endl;
    cout << "age = " << age << endl;
  };
  f1();
  return 0;
}
name = Tom
age = 18

不傳任何外部變數

語法

[]

外部變數都不能使用

1
2
3
4
5
6
7
8
9
10
int main() {
  string name = "Mary";
  int age = 18;
  auto f1 = [](){
    //cout << "name = " << name << endl;
    //cout << "age = " << age << endl;
  };
  f1();
  return 0;
}

傳參數

語法

(參數型態 參數1, 參數型態2 參數2, ...)
(string address)

以下程式碼設定lambda的參數,呼叫函式的時候代入參數。

1
2
3
4
5
6
7
8
9
int main() {
  string name = "Mary";
  int age = 18;
  auto f1 = [](string address){
    cout << "address = " << address << endl;
  };
  f1("Taiwan Taipei ....");
  return 0;
}

傳回值型態

若傳回型態為void,可以省略以下語法,也可以不寫,lambda會自動推導回值型態

->型態
1
2
3
4
5
6
7
8
9
10
11
int main() {
  string name = "Mary";
  int age = 18;
  auto f1 = [](string address) -> int{
    cout << "address = " << address << endl;
    return 100;
  };
  int val = f1("Taiwan Taipei ....");
  cout << "val = " << val << endl;
  return 0;
}
address = Taiwan Taipei ....
val = 100

函式轉成lambda

轉換前

以下程式碼有fun()的函式,參數為int型別的x與y,傳回值型別為int。

1
2
3
4
5
6
7
int fun(int x, int y) {
  return x + y;
}
int main() {
  cout << "x + y = " << fun(10, 100) << endl;
  return 0;
}
x + y = 110

轉換後

使用auto宣告函式型態,f為函式變數名。

1
2
3
4
5
6
7
int main() {
  auto f = [](int x, int y) -> int {
    return x + y;
  };
  cout << "x + y = " << f(10, 100) << endl;
  return 0;
}
x + y = 110

比對fun函式跟lambda匿名函式

1
2
3
int fun(int x, int y) {
  return x + y;
}
1
2
3
[](int x, int y) -> int {
    return x + y;
  };

results matching ""

    No results matching ""