C++ lambda表达式

lambda表达式

Lambda表达式是C ++ 11和更高版本中的一个新的语法糖,可以用在调用或作为函数参数传递的位置处定义匿名函数对象。

语法形式

[捕获列表](参数列表)[可变规则][异常说明] -> 返回类型{函数体};
[capture list] [parameters] mutable throw() -> return type { statement };

捕获列表

捕获列表总是出现在lambda函数的开始处,描述了lambda表达式可以访问上下文中的哪些变量
几种形式:

  • []表示不捕获任何变量
  • [var]按值传递方式捕获变量var
  • [=]表示按值捕获父作用域的所用变量,包括this
  • [&var]按引用传递方式捕获变量var
  • [&]表示按引用捕获父作用域的所用变量,包括this
  • [this]值传递捕获当前的this
  • [=,&]值传递与引用传递混合
    • [=, &a, &b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量
    • [&, a, this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。

注意点
捕捉列表不允许变量重复传递

  • [=,a]已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错
  • [&,&this]&已经以引用传递方式捕捉了所有变量,再捕捉this也是重复

参数列表

与普通函数的参数列表一致,如果不需要参数传递,可以连同()一起省略。

可变规则

按值捕获实际上是lambda拷贝了一个与捕获变量同名的const副本并进行操作,如果需要改变lambda中的值,就需要使用mutable修饰符。
默认情况下lambda函数总是一个const函数,mutable可以取消其常量性,使用该修饰符时,参数列表不可以省略(即使参数为空)。

异常说明

用于抛出异常,不过不建议使用。

返回类型

函数的返回类型,在不需要返回值的时候也可以连同符号->一起省略。
此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导。

函数体

内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。

lambda表达式应用

虽然lambda表达式是匿名函数,但是实际上也可以给lambda表达式指定一个名称

auto f = [](int x) { return x%3 == 0;};

lambda在c++ STL中的应用

  1. for_each
    头文件algorithm
    遍历执行相应的操作。
#include 
#include 
#include 

using namespace std;
int main(){
         vector v ;
         
         for(int i=0;i<5;i++) v.push_back(i);
         
        for_each(v.begin(),v.end(),[](int val){
            cout << val << endl;
        });        
        
        return 0;
}
  1. find_if
    头文件algorithm
    find_if函数带条件的查找元素,可以通过find_if函数来实现查找满足特定条件的元素。
    find_if函数依次的遍历容器的元素,返回第一个使函数为true的元素的迭代器,如果查找失败则返回end迭代器。
#include 
#include 
#include 

using namespace std;
int main(){
         vector v ;
         
         for(int i=1;i<5;i++) v.push_back(i);
         
        auto ele = find_if(v.begin(),v.end(),[](int val){
            return val % 3 == 0;
        });        
        
        cout << *ele << endl; 
        
        return 0;
}
  1. sort
    头文件algorithm
// 递增排序
sort(v.begin(),v.end(),[](int x,int y){     
        return xy;
}); 

你可能感兴趣的:(c++,c++)