【C++】lambda表达式

2024-04-13 1320阅读

温馨提示:这篇文章已超过393天没有更新,请注意相关的内容是否还可用!

目录

  • 一、lambda表达式
    • 1.1 C++98中的例子
    • 1.2 lambda表达式语法
    • 1.3 函数对象与lambda表达式

      一、lambda表达式

      1.1 C++98中的例子

      如果要对一个数据集合进行排序,可以使用sort函数:

      int main()
      {
      	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());
      	return 0;
      }
      

      升序:

      【C++】lambda表达式

      降序:

      【C++】lambda表达式

      如果元素是自定义类型,那么要通过仿函数来确定比较规则:

      struct Goods
      {
      	string _name;// 名字
      	double _price;// 价格
      	int _evaluate;// 评价
      	Goods(const char* str, double price, int evaluate)
      		:_name(str)
      		, _price(price)
      		, _evaluate(evaluate)
      	{}
      };
      //小于 -- 升序
      struct ComparePriceLess
      {
      	bool operator()(const Goods& gl, const Goods& gr)
      	{
      		return gl._price  gr._price;//价格
      	}
      };
      int main()
      {
      	vector v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠萝", 1.5, 4 } };
      	sort(v.begin(), v.end(), ComparePriceLess());
      	sort(v.begin(), v.end(), ComparePriceGreater());
      }
      

      价格升序:

      【C++】lambda表达式

      价格降序:

      【C++】lambda表达式

      以上代码虽然可以实现自定义类型中的某个成员的比较规则,但是这样写是不是有些麻烦,每次实现一个algorithm算法,都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。所以,C++11增加了新语法——lambda表达式

      1.2 lambda表达式语法

      lambda表达式书写格式:

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

      lambda表达式各部分说明:

      1. [capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。
      2. (parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略
      3. mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。
      4. ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
      5. {statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

      注意:

      在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空。因此C++11中最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情。

      两个数相加:

      auto add = [](int a, int b)->int {return a + b; };
      cout return a + b; };
       { "苹果", 2.1, 5 }, { "香蕉", 3, 4 },
      	{ "橙子", 2.2, 3 }, { "菠萝", 1.5, 4 } };
      sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2)
      	{return g1._price 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]