c++ 11中λ,std::函数和std:绑定详解

  

  

在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数字{1,2,3,4、5、10、15、20、25、35、45个,50个};

  

我们最先想到的方法自然是定义两个函数,分别按照上面的要求打印出需要的数字,它们的定义如下:

        空白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;   }   });      

这里,我们不用单独定义函数,直接以内联的方式解决了问题,并且,这段代码一气呵成,你很直观的看到了执行的逻辑。

  

<强>下面,我们再详细看一下λ表达式中的捕获列表的语法,它可能是以下几种情况中的一种: