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;
});
相关文章
|
6月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
91 5
|
2月前
|
算法 编译器 程序员
C++ 11新特性之Lambda表达式
C++ 11新特性之Lambda表达式
16 0
|
4月前
|
安全 编译器 C++
C++一分钟之-泛型Lambda表达式
【7月更文挑战第16天】C++14引入泛型lambda,允许lambda接受任意类型参数,如`[](auto a, auto b) { return a + b; }`。但这也带来类型推导失败、隐式转换和模板参数推导等问题。要避免这些问题,可以明确类型约束、限制隐式转换或显式指定模板参数。示例中,`safeAdd` lambda使用`static_assert`确保只对算术类型执行,展示了一种安全使用泛型lambda的方法。
60 1
|
5月前
|
算法 编译器 C++
C++一分钟之—Lambda表达式初探
【6月更文挑战第22天】C++的Lambda表达式是匿名函数的快捷方式,增强函数式编程能力。基本语法:`[capture](params) -&gt; ret_type { body }`。例如,简单的加法lambda:`[](int a, int b) { return a + b; }`。Lambda可用于捕获外部变量(值/引用),作为函数参数,如在`std::sort`中定制比较。注意点包括正确使用捕获列表、`mutable`关键字和返回类型推导。通过实践和理解这些概念,可以写出更简洁高效的C++代码。
53 13
|
5月前
|
C++
C++语言的lambda表达式
C++从函数对象到lambda表达式以及操作参数化
|
5月前
|
C++
C++一分钟之-理解C++的运算符与表达式
【6月更文挑战第18C++的运算符和表达式构成了编程的基础,涉及数学计算、逻辑判断、对象操作和内存管理。算术、关系、逻辑、位、赋值运算符各有用途,如`+`、`-`做加减,`==`、`!=`做比较。理解运算符优先级和结合律至关重要。常见错误包括优先级混淆、整数除法截断、逻辑运算符误用和位运算误解。解决策略包括明确优先级、确保浮点数除法、正确使用逻辑运算符和谨慎进行位运算。通过实例代码学习,如 `(a &gt; b) ? &quot;greater&quot; : &quot;not greater&quot;`,能够帮助更好地理解和应用这些概念。掌握这些基础知识是编写高效、清晰C++代码的关键。
36 3
|
5月前
|
C语言 C++ 容器
c++primer plus 6 读书笔记 第五章 循环和关系表达式
c++primer plus 6 读书笔记 第五章 循环和关系表达式
|
5月前
|
计算机视觉 C++
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
49 0
|
5月前
|
C++
C++ lambda表达式
C++ lambda表达式
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
29 4