lambda表达式学习

lambda表达式的基本形式,如下:
[capture list] (params list)  [key word: mutuble] ->return type { func body }
说明:
(1) [capture list]里面的内容具体形式如下:

(2) params list 输入参数,这个和普通的函数一样
(3)keyword:mutuble:默认情况下,lambda表达式不会改变一个通过传值方式来捕获参数的值,通过mutuble可以实现这个问题。
(4)return type:默认该部分是可选的,但是如果lambda表达式有2个或以上的return,那么必须指定返回类型
(5) func body:函数体


以下是一些例子

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;


void testCaptureList()
{
  int a = 1;
  int b = 2;
//  auto fun = []() { cout << a + b << endl;}; // error 无法隐式捕获“a” "b",因为尚未指定默认捕获模式
  auto fun0 = [a,b]() { cout << a + b << endl;}; //0k
  fun0();     //3
  auto fun1 = [=]() { cout << a + b << endl;}; // OK
//  auto fun2 = [=]() { a++; cout << a + b << endl;}; // error C3491: “a”: 无法在非可变 lambda 中修改通过复制捕获
  fun1();     //3
  cout << "a = " << a << " b = " << b << endl;
  auto fun3 = [&]() { a++; b++; cout << a + b << endl;};  
  fun3();     //5

  cout << "a = " << a << "  b=" << b << endl;
 // auto fun4 = [=, &a] () { a++; b++; cout << a + b << endl;}; // error C3491: “b”: 无法在非可变 lambda 中修改通过复制捕获
  auto fun5 = [&b, &a]() { a++; b++; cout << a + b << endl;}; 
  fun5();     //7
}

void testReturnType()
{
  auto fun1 = []() {return 1;};
  cout << fun1() << endl;

  auto fun2 = [](int a) {return a + 1;};
  cout << fun2(4) << endl;

  int bbb = 5;
  //在VS2017编译可以通过,在code:blocks 16.01编译出现问题(error C3499: 已指定返回类型为 void 的 lambda 无法返回值) 
  auto fun3 = [](int a) { if (a < 0) return -a; else return a;};
  cout << fun3(bbb) << endl;

  auto fun4 = [](int a) -> int { if (a < 0) return -a; else return a;};
  cout << fun4(-4) << endl;
}

void testMutable()
{
  int v1 = 33;
  auto f = [v1]() mutable {return ++v1;};
  v1 = 0;
  cout << f() <<" ," <<v1<<endl;    //34,0

  auto f1 = [&v1]()  {return ++v1;};
  v1 = 0;
  cout << f1() << endl;   //1
  cout << v1 << endl;     //1


  auto f2 = [&v1]() {return ++v1;};
  v1 = 0;
  cout << f1() << "," << v1 << endl;  //1,0  右结合原因
}

void testParam()
{
  string a = "1111";
  string b = "22222";
  string c = "3333";
  auto theSameLen = [](const string &a, const string &b) {return a.length() == b.length();};
  cout << theSameLen(a, b) << endl;   //0
  cout << theSameLen(a, c) << endl;    //1

  auto addChZ = [](string &a) { a += "Z"; };
  addChZ(a);
  cout<<a<< endl;       //1111Z

}
void Print(const int &a)
{
  cout << a << " ";
}
int main()
{
  int aa[] = { 1,2,3,4 };
  for_each(aa, aa + 4, Print);
  cout << endl;
  for_each(aa, aa + 4, [](const int &a) { cout << a << " "; });

  auto fun = [](int a, int b) { return a + b;};
  cout << endl << fun(2, 3) << endl;

  int a1 = 3;
  auto fun2 = [a1](int a) {return a1 + a;  };
  cout << endl << fun2(33) << endl;

  testCaptureList();
  testReturnType();
  testMutable();
  testParam();
  system("pause");
  
  return 0;
}
关于lambda表达的效率问题,参考文章: c++11 lambda 的效率

猜你喜欢

转载自blog.csdn.net/dyingfair/article/details/79779012