C语言中lambda表达式如何使用?能否详细介绍一下?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1642个文字,预计阅读时间需要7分钟。
目录前言Lambda表达式格式一些语法走进底层前言Lambda表达式是C++11及以后版本中引入的一种新的语法特性,它允许在运行时创建匿名函数。本文将简要介绍Lambda表达式的格式、一些常用语法,并探讨其在C++98中的实现。
Lambda表达式格式Lambda表达式的基本格式如下:[捕获列表](参数列表) -> 返回类型 {函数体}
捕获列表:可选,用于捕获外部变量的引用或值。参数列表:可选,类似于普通函数的参数列表。返回类型:可选,如果省略,则推导自函数体的返回值。函数体:包含函数逻辑的代码块。
一些语法
1.默认参数
2.初始化列表
3.变长参数
4.尾递归
走进底层在C++98中,虽然不能直接使用Lambda表达式,但可以通过函数指针和闭包(closure)的概念来模拟Lambda表达式的功能。以下是一个C++98中的Lambda表达式示例:
cpp#include #include
int main() { std::vector v={1, 2, 3, 4, 5};
// 模拟Lambda表达式 for (int i=0; i int { return value + x; }; std::cout < return 0;} 在这个示例中,我们通过捕获局部变量`value`并在每次迭代中创建一个新的匿名函数`func`来模拟Lambda表达式。这个匿名函数接收一个参数`x`,并返回`value + x`的结果。 C++98中的一个例子。 #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Goods
{
string _name;
float _price;
int _evaluate;
Goods(const char* str, double price, int evaluate)
:_name(str)
, _price(price)
, _evaluate(evaluate)
{}
};
struct PriceGreater
{
bool operator()(const Goods& g1, const Goods& g2)
{
return g1._price < g2._price;
}
};
struct PriceLess
{
bool operator()(const Goods& g1, const Goods& g2)
{
return g1._price > g2._price;
}
};
int main(void)
{
vector<Goods> v{ {"苹果", 3.15, 5}, {"香蕉", 4.2, 3}, {"西瓜", 2.8, 4} };
sort(v.begin(), v.end(), PriceLess()); //按价格的降序比较
sort(v.begin(), v.end(), PriceGreater()); //按价格的升序比较
return 0;
}
如果待排序的元素是自定义类型,使用sort算法排序时,需要用户去定义仿函数类。如果每次比较逻辑不同,就需要实现不同仿函数类,这是极其不方便的。所以c++11语法增加了Lambda表达式。 lambda表达式的格式 [捕捉列表](参数列表)mutable->返回值类型{ 语句部分 }; 其中参数列表、返回值类型是可选的,捕捉列表、函数体可以为空。 先来看一个较为简单的lamda表达式 int main(void)
{
auto add = [](int a, int b)->int {return a + b; };
cout << add(1, 2) << endl;
return 0;
}
mutable可以省略,暂时不考虑。 所以最简单的lambda表达式应该是 lambda表达式又被称为匿名函数,无法被直接调用,它的底层其实也是仿函数类。需要借助auto将表达式赋值给一个变量。 lambda表达式的捕捉列表不能捕捉全局变量/静态变量 //lambda表达式的捕捉列表不能捕捉全局变量 / 静态变量
int c = 0, d = 0;
auto func1 = [c, d]() {};
int main(void)
{
static int a = 0;
static int b = 0;
auto func1 = [a, b]() {};
return 0;
}
如果想要改变参数/捕捉列表,那么就需要加mutable取消 //交换两个变量的值,方式一:
int a = 1, b = 2;
auto swap1 = [](int& x, int& y)mutable {int tmp = x; x = y; y = tmp; };
swap1(a, b);
捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用。 [var]:表示值传递方式捕捉变量var [=]:表示值传递方式捕获所有父作用域中的变量(包括this) [&var]:表示引用传递捕捉变量var [&]:表示引用传递捕捉所有父作用域中的变量(包括this) [this]:表示值传递方式捕捉当前的this指 默认情况下,使用值传递的方式,捕捉到的变量被修饰成 函数体内使用捕捉到变量,实际上是捕捉变量的一份拷贝,所以需要对捕捉变量进行修改时,不能使用值传递的方式。 //交换两个变量的值,方式二:
auto swap3 = [&c, &d](){int tmp = c; c = d; d = tmp; };
swap3();
同一个变量不能被同一种传递方式多次捕捉。捕捉的范围:父作用域中所有的非静态局部变量。 调用lambda表达式的时候,先把它赋值给auto类型的对象,然后再使用 auto的作用是自动推导右边表达式的类型,那么lambda表达式的类型是什么?目录
前言
lambda表达式格式
[]是千万不能省略的,编译器会根据[]判断该表达式是否为lambda表达式,捕捉列表能够捕捉上下文的变量提供给lambda表达式使用。()一起省略()。[]{}一些语法
const 属性const属性;引用传递方式没有被修饰。走进底层
()调用。
add是一个类对象,类名为<lambda_+uuid>,点击此处了解uuid。
增加一个lambda表达式的调用
add(1, 2);
转到反汇编,发现它的类里重载了(),调用lambda表达式的底层是去调用类成员方法operator()。
可见lambda表达式的底层就是仿函数类,所以它的调用方法也和仿函数是一样的。
不同的lambda表达式生成的类,是不同的类。一个lambda表达式再写一份,生成的类也是不同的,可以认为一个lambda表达式语句生成一个自己唯一的类。
//lambda表达式格式 auto add = [](int a, int b)->int {return a + b; }; add(1, 2); auto add2 = [](int a, int b)->int {return a + b; }; add2(1, 2);
因此要注意,lambda表达式之间不能相互赋值。
到此这篇关于C++lambda表达式使用介绍的文章就介绍到这了,更多相关C++lambda内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!
本文共计1642个文字,预计阅读时间需要7分钟。
目录前言Lambda表达式格式一些语法走进底层前言Lambda表达式是C++11及以后版本中引入的一种新的语法特性,它允许在运行时创建匿名函数。本文将简要介绍Lambda表达式的格式、一些常用语法,并探讨其在C++98中的实现。
Lambda表达式格式Lambda表达式的基本格式如下:[捕获列表](参数列表) -> 返回类型 {函数体}
捕获列表:可选,用于捕获外部变量的引用或值。参数列表:可选,类似于普通函数的参数列表。返回类型:可选,如果省略,则推导自函数体的返回值。函数体:包含函数逻辑的代码块。
一些语法
1.默认参数
2.初始化列表
3.变长参数
4.尾递归
走进底层在C++98中,虽然不能直接使用Lambda表达式,但可以通过函数指针和闭包(closure)的概念来模拟Lambda表达式的功能。以下是一个C++98中的Lambda表达式示例:
cpp#include #include
int main() { std::vector v={1, 2, 3, 4, 5};
// 模拟Lambda表达式 for (int i=0; i int { return value + x; }; std::cout < return 0;} 在这个示例中,我们通过捕获局部变量`value`并在每次迭代中创建一个新的匿名函数`func`来模拟Lambda表达式。这个匿名函数接收一个参数`x`,并返回`value + x`的结果。 C++98中的一个例子。 #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Goods
{
string _name;
float _price;
int _evaluate;
Goods(const char* str, double price, int evaluate)
:_name(str)
, _price(price)
, _evaluate(evaluate)
{}
};
struct PriceGreater
{
bool operator()(const Goods& g1, const Goods& g2)
{
return g1._price < g2._price;
}
};
struct PriceLess
{
bool operator()(const Goods& g1, const Goods& g2)
{
return g1._price > g2._price;
}
};
int main(void)
{
vector<Goods> v{ {"苹果", 3.15, 5}, {"香蕉", 4.2, 3}, {"西瓜", 2.8, 4} };
sort(v.begin(), v.end(), PriceLess()); //按价格的降序比较
sort(v.begin(), v.end(), PriceGreater()); //按价格的升序比较
return 0;
}
如果待排序的元素是自定义类型,使用sort算法排序时,需要用户去定义仿函数类。如果每次比较逻辑不同,就需要实现不同仿函数类,这是极其不方便的。所以c++11语法增加了Lambda表达式。 lambda表达式的格式 [捕捉列表](参数列表)mutable->返回值类型{ 语句部分 }; 其中参数列表、返回值类型是可选的,捕捉列表、函数体可以为空。 先来看一个较为简单的lamda表达式 int main(void)
{
auto add = [](int a, int b)->int {return a + b; };
cout << add(1, 2) << endl;
return 0;
}
mutable可以省略,暂时不考虑。 所以最简单的lambda表达式应该是 lambda表达式又被称为匿名函数,无法被直接调用,它的底层其实也是仿函数类。需要借助auto将表达式赋值给一个变量。 lambda表达式的捕捉列表不能捕捉全局变量/静态变量 //lambda表达式的捕捉列表不能捕捉全局变量 / 静态变量
int c = 0, d = 0;
auto func1 = [c, d]() {};
int main(void)
{
static int a = 0;
static int b = 0;
auto func1 = [a, b]() {};
return 0;
}
如果想要改变参数/捕捉列表,那么就需要加mutable取消 //交换两个变量的值,方式一:
int a = 1, b = 2;
auto swap1 = [](int& x, int& y)mutable {int tmp = x; x = y; y = tmp; };
swap1(a, b);
捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用。 [var]:表示值传递方式捕捉变量var [=]:表示值传递方式捕获所有父作用域中的变量(包括this) [&var]:表示引用传递捕捉变量var [&]:表示引用传递捕捉所有父作用域中的变量(包括this) [this]:表示值传递方式捕捉当前的this指 默认情况下,使用值传递的方式,捕捉到的变量被修饰成 函数体内使用捕捉到变量,实际上是捕捉变量的一份拷贝,所以需要对捕捉变量进行修改时,不能使用值传递的方式。 //交换两个变量的值,方式二:
auto swap3 = [&c, &d](){int tmp = c; c = d; d = tmp; };
swap3();
同一个变量不能被同一种传递方式多次捕捉。捕捉的范围:父作用域中所有的非静态局部变量。 调用lambda表达式的时候,先把它赋值给auto类型的对象,然后再使用 auto的作用是自动推导右边表达式的类型,那么lambda表达式的类型是什么?目录
前言
lambda表达式格式
[]是千万不能省略的,编译器会根据[]判断该表达式是否为lambda表达式,捕捉列表能够捕捉上下文的变量提供给lambda表达式使用。()一起省略()。[]{}一些语法
const 属性const属性;引用传递方式没有被修饰。走进底层
()调用。
add是一个类对象,类名为<lambda_+uuid>,点击此处了解uuid。
增加一个lambda表达式的调用
add(1, 2);
转到反汇编,发现它的类里重载了(),调用lambda表达式的底层是去调用类成员方法operator()。
可见lambda表达式的底层就是仿函数类,所以它的调用方法也和仿函数是一样的。
不同的lambda表达式生成的类,是不同的类。一个lambda表达式再写一份,生成的类也是不同的,可以认为一个lambda表达式语句生成一个自己唯一的类。
//lambda表达式格式 auto add = [](int a, int b)->int {return a + b; }; add(1, 2); auto add2 = [](int a, int b)->int {return a + b; }; add2(1, 2);
因此要注意,lambda表达式之间不能相互赋值。
到此这篇关于C++lambda表达式使用介绍的文章就介绍到这了,更多相关C++lambda内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

