在c++ 11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛。不过我相信这些新特性当中有一些,应该成为所有c++开发者的常规装备。本文主要介绍了c++ 11中λ,std::函数和std:绑定、下面来一起看看详细的介绍吧。
c++ 11中新增了λ表达式这一语言特性.lambda表达式可以让我们快速和便捷的创建一个“函数”。
<强>下面是λ表达式的语法:强>
[俘获名单]{身体} [俘获名单](params){身体} [俘获名单](params)→ret{身体} [俘获名单](params)可变异常属性→ret{身体}
<强>这其中:强>
-
<李>——俘获名单是需要捕获的变量列表,用逗号分隔。其详细说明见下文。李>
<李> - params是λ表达式需要的参数列表,写法和函数参数一样,不过这里不支持默认参数。李>
<李>——ret指明了λ表达式的返回值。通过返回语句,如果编译器能够推断出返回值的类型。或者表达式没有返回值,”→李ret”可以省略。>
<李>——身体函数体。李>
<李>——可变当捕获列表是以复制(见下文)的形式捕获时,默认这些复制的值是常量的,除非指定了可变的。李>
<李>——异常提供了异常的说明。李>
<李>——属性对于属性的描述可以参见这里:http://en.cppreference.com/w/cpp/language/attributes,这里不多说明。李>
下面,我们通过经典的Hello World示例来看一下λ表达式:
汽车λ?=[]{std:: cout & lt; & lt;“你好,世界! \ n”;};λ?();
这个λ表达式将打印出字符串“你好,世界!”。
同时,我们将这个表达式赋值给“λ?”这个变量,然后像调用函数一样,调用这个λ表达式。
使用λ表达式,可以让我们省却定义函数的麻烦,以内联的方式写出代码,这样的代码通常更简洁。
并且,由于阅读代码时不用寻找函数定义,这样的代码也更易读。
下面,我们来看另外一个例子。这个例子的需求的是:
<>强分两次,打印出一个向量集合中,所有:强>
1。模5=0
2。大于20
的数字。
现假设已有这个集合的定义如下:
<代码> vector
我们最先想到的方法自然是定义两个函数,分别按照上面的要求打印出需要的数字,它们的定义如下:
空白printNumber1 (vector和数字){ (const int&我:数字){ 如果(我% 5==0){ cout<& lt; i<& lt; endl; } } } 空白printNumber1 (vector 和数字){ (const int&我:数字){ 如果(我% 5==0){ cout<& lt; i<& lt; endl; } } }
<>强然后,我们在需要的地方,调用它们:强>
printNumber1(数字);printNumber2(数字);
<强>这里逻辑上并没有问题,但是:强>
1。这里我们必须先定义这个函数,才能使用。而这样的函数,可能实际上我们只会使用一次。
2。当工程大到一定程度,我们可能不记得每个函数的实现(所以函数命名很重要,原谅我这里给函数起了很含糊的名字,你在实际上工程中,请不要这样做),为了知道每个函数的实现,我们不得不查看函数的定义,这无疑给代码的阅读造成了一定的麻烦。
下面,我们来看看使用λ表达式如何改善上面说的问题。
<强>使用λ表达式,我们可以这样写:强>
numbers.end for_each (numbers.begin () (), [] (int i) { 如果(我% 5==0){ cout<& lt; i<& lt; endl; } }); numbers.end for_each (numbers.begin () (), [] (int i) { 如果我比;20){ cout<& lt; i<& lt; endl; } });
这里,我们不用单独定义函数,直接以内联的方式解决了问题,并且,这段代码一气呵成,你很直观的看到了执行的逻辑。
<强>下面,我们再详细看一下λ表达式中的捕获列表的语法,它可能是以下几种情况中的一种:强>
-
<李>[]不捕获任何变量李>
<李>[和]以引用的方式捕获所有变量