【C++11】lambda表达式 | 函数包装器

文章目录

  • 一、lambda表达式
    • 1. 为什么需要lambda表达式
    • 2. lambda的定义
    • 3. lambda的语法
      • 捕捉列表
    • 4. 函数对象和lambda表达式的底层原理
  • 二、函数包装器
    • 1. function包装器
    • 2. bind包装器
      • 用bind包装器绑定固定参数
      • 用bind包装器调整传参顺序
      • 无意义的绑定
    • 3. bind包装器的意义

一、lambda表达式

1. 为什么需要lambda表达式

在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。

#include 
#include 
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<int>());
	return 0;
}

如果待排序元素为自定义类型,需要用户使用仿函数定义排序时的比较规则:

struct Goods
{
   
   
	string _name;  //名字
	double _price; //价格
	int _num;      //数量
};

struct ComparePriceLess
{
   
   
	bool operator()(const Goods& g1, const Goods& g2)
	{
   
   
		return g1._price < g2._price;
	}
};
struct ComparePriceGreater
{
   
   
	bool operator()(const Goods& g1, const Goods& g2)
	{
   
   
		return g1._price > g2._price;
	}
};
struct CompareNumLess
{
   
   
	bool operator()(const Goods& g1, const Goods& g2)
	{
   
   
		return g1._num < g2._num;
	}
};
struct CompareNumGreater
{
   
   
	bool operator()(const Goods& g1, const Goods& g2)
	{
   
   
		return g1._num > g2._num;
	}
};
int main()
{
   
   
	vector<Goods> v = {
   
    {
   
    "苹果", 2.1, 300 }, {
   
    "香蕉", 3.3, 100 }, {
   
    "橙子", 2.2, 1000 }, {
   
    "菠萝", 1.5, 1 } };
	sort(v.begin(), v.end(), ComparePriceLess());    //按价格升序排序
	sort(v.begin(), v.end(), ComparePriceGreater()); //按价格降序排序
	sort(v.begin(), v.end(), CompareNumLess());      //按数量升序排序
	sort(v.begin(), v.end(), CompareNumGreater());   //按数量降序排序
	return 0;
}

仿函数是重载了operator()的类,仿函数确实能够解决这里的问题,但可能仿函数的定义位置可能和使用仿函数的地方隔得比较远,这就要求仿函数的命名必须要通俗易懂,否则会降低代码的可读性。对于这种场景就比较适合使用lambda表达式。

2. lambda的定义

lambda表达式首先是一个可调用对象,是一个无名函数,一个lambda表达式可以被赋值给std::function对象,或者直接使用auto类型推导。std::function是一个通用的函数封装器,它可以包装任意可调用对象,包括函数指针、函数对象、成员函数指针以及lambda表达式。

int main()
{
   
   
	vector<Goods> v = {
   
    {
   
    "苹果", 2.1, 5 }, {
   
    "香蕉", 3, 4 }, 

你可能感兴趣的:(C++,c++,lambda,函数包装器,bind,function,lambda表达式)