C++11 lambda表达式 可调用对象包装器function bind

本文详细介绍了C++11的lambda表达式,包括其应用场景、语法、捕捉列表和本质。同时,文章讨论了`std::function`作为可调用对象包装器的作用和使用,以及`std::bind`的功能,如何通过它们调整参数和创建新的可调用对象。通过实例展示了如何利用lambda和bind简化代码,提高可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

lambda表达式

lambda表达式是什么,应用场景

场景引入:

lambda表达式是什么?

lambda表达式的语法

语法:

捕捉列表的说明:

注意:

lambda表达式的本质

包装器function

function 概念说明

function 使用说明

function可调用对象包装器的作用:

 包装器bind

bind 概念说明 && 使用说明

bind 可调用对象包装器使用实例:


lambda表达式

lambda表达式是什么,应用场景

场景引入:

void test1()
{
    int array[] = {4, 1, 8, 5, 3, 7, 0, 9, 2, 6};
// 默认按照小于比较,排出来结果是升序
    std::sort(array, array + sizeof(array) / sizeof(array[0]));
// 如果需要降序,需要改变元素的比较规则
    std::sort(array, array + sizeof(array) / sizeof(array[0]), greater<int>());
}
struct Goods
{
    string _name;  // 名字
    double _price; // 价格
    int _evaluate; // 评价
    Goods(const char* str, double price, int evaluate)
            :_name(str)
            , _price(price)
            , _evaluate(evaluate)
    {}
};

如上,对于整型数组使用sort库函数排序时,若想要改变比较规则和排序规则,引入function库函数的greater<T>仿函数类即可。

但是对于下方的Goods这样的自定义类型对象来说,如果想要按照某个数据成员进行排序,可是它又没有重载operator<(sort默认调用对象的operator<进行大小比较),我们此时就必须使用函数对象,仿函数来传给sort的第三个参数。

对于一个算法sort还要再定义一个仿函数类,是很麻烦的,如果是对于多个类的属性都要进行排序,就要定义多个仿函数类,很不方便,代码可读性差且给仿函数类命名也是个问题。

lambda表达式就是为了解决上方场景。

void test2()
{
    vector<Goods> v = {
  
  {"1",1.1,1}, {"2",2.2,2},{"3",3.3,3}};
    sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){return g1._name < g2._name;});
    sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){return g1._name > g2._name;});
    sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){return g1._price < g2._price;});
    sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){return g1._evaluate < g2._evaluate;});
}

lambda表达式是什么?

lambda表达式在使用上就是一个函数(匿名函数,上层看没有名字),本质上是一个仿函数,函数对象(也就是某个类实现了operator(),这个类的实例化对象)。

恰当使用lambda表达式可以让代码变得简洁,并且可以提高代码的可读性。

lambda表达式的语法

语法:

[capture-list] (parameters) mutable -> return-type { statement }

1. [capture-list] : 捕捉列表,该列表总是出现在lambda表达式的开始位置,编译器根据[]来判断接下来的代码是否为lambda表达式,捕捉列表能够捕捉上下文中的变量供lambda表达式使用。

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

3. mutable:见下方lambda表达式本质说明。
4. ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
5. {statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

综上,其实lambda表达式和普通函数非常相似:有参数列表,有返回值,有函数体,就是没有函数名。还多了一个捕捉列表。

捕捉列表的说明:

捕捉列表描述了上下文中哪些数据可以被lambda使用,以及使用的方式是传值还是传引用。

[var]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值