C++ lambda表达式

简介: 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 <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
         vector<int> 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 <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
         vector<int> 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 x<y;
});         
// 递减排序
sort(v.begin(),v.end(),[](int x,int y){
        return x>y;
});
相关文章
|
3天前
|
算法 编译器 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
47 4
|
3天前
|
存储 算法 程序员
【C++20 新特性 】模板参数包展开与Lambda初始化捕获详解
【C++20 新特性 】模板参数包展开与Lambda初始化捕获详解
89 3
|
3天前
|
存储 算法 C++
C++11:lambda表达式 & 包装器
C++11:lambda表达式 & 包装器
8 0
|
3天前
|
算法 编译器 程序员
【C++入门到精通】 Lambda表达式 C++11 [ C++入门 ]
【C++入门到精通】 Lambda表达式 C++11 [ C++入门 ]
12 1
|
3天前
|
Java 编译器 Linux
【C++11(二)】lambda表达式以及function包装器
【C++11(二)】lambda表达式以及function包装器
|
3天前
|
算法 编译器 C++
C++中的lambda表达式
C++中的lambda表达式
7 0
|
3天前
|
算法 安全 编译器
【C++ 17 新特性 折叠表达式 fold expressions】理解学习 C++ 17 折叠表达式 的用法
【C++ 17 新特性 折叠表达式 fold expressions】理解学习 C++ 17 折叠表达式 的用法
36 1
|
3天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
18 0
|
1天前
|
测试技术 C++
C++|运算符重载(3)|日期类的计算
C++|运算符重载(3)|日期类的计算
|
2天前
|
C语言 C++ 容器
C++ string类
C++ string类
8 0