网站建设项目进度表,中国建设工程招聘信息网站,实时新闻最新消息,深圳世茂前海中心文章首发公众号#xff1a;iDoitnow 为什么引入Lambda
Lambda表达式是一个可以内联在我们代码中的函数#xff0c;我们可以将他传递给另外一个函数。在没有引入Lambda表达式之前#xff0c;当我们遇到需要对多个数据#xff0c;按照同一规则进行操作的时候#xff0c;创建… 文章首发公众号iDoitnow 为什么引入Lambda
Lambda表达式是一个可以内联在我们代码中的函数我们可以将他传递给另外一个函数。在没有引入Lambda表达式之前当我们遇到需要对多个数据按照同一规则进行操作的时候创建机动函数会更简单但是必须在其他地方定义好该函数然后再使用它有时候两者之间可能距离离的很远想要了解该函数内部操作的原理需要翻阅多页源代码找它的定义这样使得代码的可读性大打折扣。这就是Lambda表达式出现的主要原因。
基本的Lambda语法
lambda表达式是一个匿名函数。其可以捕获作用域中的变量。其在C11中常用的语法如下
[captures](params){body}
[captures]{body} //省略了形参列表函数不接收实参如同形参列表为()
[captures](params)-return-type{body} //return-type为返回类型//eg:
//捕获列表 参数列表 函数体[ ] (int a, int b) { return a b;}
//捕获列表 参数列表 返回类型 函数体[ ] (double x) - double {int y x; return x - y;}
/*注Lambda函数没有声明返回类型其返回类型相当于使用decltyp根据返回值推断得到的。如果函数体内不包含返回语句则推断出返回类型为void。但是仅当函数体完全由一条返回语句组成时自动类型推断才管用否则需要使用新增的返回类型后置语法*/【注Lambda表达式自动推断返回值类型有些编译器像GCC即使你有多于一个返回语句也不可以自动推断成功但标准不保证这一点因此为了防止意外的发生当函数体内返回语句不止一条的时候建议使用返回类型后置语法】
其中captures为捕获它一个包含0个或者多个捕获符的用逗号分隔的列表。params为参数列表body为函数体。默认的捕获符只有 采用引用隐式捕获的方式使用自动变量 采用复制隐式捕获的方式使用自动变量 [] // 默认不捕获
[] // 默认以引用捕获意味着在函数体内可以按照引用的方式使用Lambda表达式所在范围内所有可见的局部变量
[, i] // 以引用捕获同上但i以值捕获
[] // 默认以复制捕获意味着在函数体内可以按照值传递的方式使用Lambda表达式所在范围内所有可见的局部变量
[, i] // 以复制捕获同上但 i 以引用捕获下面我们通过C Primer Plus中的一个例子进一步理解Lambda表达式
#include iostream
#include vector
#include algorithm
#include cmath
#include ctime
const long Size 390000L;
int main()
{using std::cout;std::vectorint numbers(Size);std::srand(std::time(0));std::generate(numbers.begin(), numbers.end(), std::rand);cout Sample size Size \n;// using lambdasint count3 std::count_if(numbers.begin(), numbers.end(),[](int x){return x % 3 0;});cout Count of numbers divisible by 3: count3 \n;int count13 0;std::for_each(numbers.begin(), numbers.end(),[count13](int x){count13 x % 13 0;});cout Count of numbers divisible by 13: count13 \n;// using a single lambdacount3 count13 0;std::for_each(numbers.begin(), numbers.end(),[](int x){count3 x % 3 0; count13 x % 13 0;});cout Count of numbers divisible by 3: count3 \n;cout Count of numbers divisible by 13: count13 \n;return 0;
}程序输出结果
Sample size 390000
Count of numbers divisible by 3: 130274
Count of numbers divisible by 13: 30009
Count of numbers divisible by 3: 130274
Count of numbers divisible by 13: 30009Lambda与STL的结合
当STL中的算法algorithms库遇到Lambda的时候会碰出什么样的火花呢毋庸置疑这极大的提高我们的编程效率更提高了代码的整洁性和可读性例如
vectorint v;
v.push_back(1);
v.push_back(2);
//不使用Lambda表达式
for ( auto itr v.begin(); itr ! v.end(); itr )
{cout *itr;
}//使用Lambda表达式
for_each( v.begin(), v.end(), [] (int val){cout val;} );正如上面的例子使用Lambda表达式后代码显的更漂亮而且它的可读性也很强结构更紧凑。
总结
Lambda 引入使我们在某些情况下能够将类似于函数的表达式用作接受函数指针或函数符的函数的参数。它更像胶水代码允许我们将简单的处理逻辑传递到需要的位置提高开发效率使得代码结构简洁而且易于理解。 参考文献 C Primer Plus(第六版) - 第18章 探讨C新标准 C 参考手册