回调函数、qsort函数、sort函数与lambda表达式

目录

目录

1、回调函数

2、sort函数

3、lambda表达式

4、qsort与sort函数使用lambda表达式


1、回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一 个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或 条件进行响应。
简单来说:回调函数即:传函数地址 ----> 另一函数调用 

实际上qsort函数就是使用回调函数的一个很好的例子

参数说明:base首元素地址, num数组的元素个数, width一个元素字节大小,compare比较函数的地址)

注:比较函数要求用户自定义,比较函数的参数为const void*类型,两个参数为待比较元素的地址。

比较函数的返回值,在图中已经注明。

关于qsrot进一步理解参考后序文章,qsort函数模拟实现。 

实例:

对数组排序

//void* 定义的指针(无类型)不可指直接解引用
//需先强制类型转化,在解引用
int comper(const void* a, const void* b)
{
	return (*(int*)a - *(int*)b); //排升序
    //return (*(int*)a - *(int*)b); //排降序
}
int main()
{
    int arr[] = { 5, 7, 1, 5, 6, 3, 2, };
    qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), comper);
    return 0;
}

对结构体排序

typedef struct stu {
	char name[20];
	int age;
	double score;
}stu;

//按年龄升序排序
int comper_by_age(const void* el1, const void* el2)
{
	return (((stu*)el1)->age - ((stu*)el2)->age);
}
//按年龄升序拍序
int comper_by_name(const void* el1, const void* el2)
{
	//挨个字母比较 -- ASCII值
	return strcmp(((stu*)el1)->name, ((stu*)el2)->name);
}
void printf_stus(stu stus[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%-8s  %d  %1.2f\n", stus[i].name, stus[i].age, stus[i].score);
	}
}
int main()
{
	stu stus[3] = { {"zhangsan", 20, 80.1}, {"lisi", 21, 70.5}, {"wangwu", 19, 91} };
	int sz = sizeof(stus) / sizeof(stus[0]);
	qsort(stus, sz, sizeof(stus[0]), comper_by_age);
	printf_stus(stus, sz);
	return 0;
}

2、sort函数

 参数说明:first对要排序的序列起始迭代器,last对要排序的序列最终迭代器

comp:比较函数,sort函数的比较函数形参不能是指针,可以是引用或者形参变量,返回值一般为bool类型,也可以为int

实例:

对数组进行排序

class comper {
public:
	bool operator()(int a, int b)
	{
		return a < b;
	}
};

int main()
{
    int arr[] = {5, 7, 1, 5, 6, 3, 2};
    sort(arr, arr + sizeof(arr) / sizeof(arr[0]), comper());
	for (int i = 0; i < 7; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
    return 0;
}

3、lambda表达式

lambda表达式书写格式:[capture - list](parameters) mutable -> return-type{ statement }

1、[capture - list] : 捕捉列表->捕捉列表能够捕捉上下文中的变量供lambda函数使用。

[var]:表示值传递方式捕捉变量var

[=]:表示值传递方式捕获所有父作用域中的变量(包括this)

[&var]:表示引用传递捕捉变量var

[&]:表示引用传递捕捉所有父作用域中的变量(包括this)

[this]:表示值传递方式捕捉当前的this指针

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

3、mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)

4、->returntype:返回值类型,返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

5、{statement}:函数体。和普通函数一样

参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空。

最简单的lambda函数为:[]{};

4、qsort与sort函数使用lambda表达式

qsort函数使用lambda表达式

int main()
{
    int arr[] = { 5, 7, 1, 5, 6, 3, 2};
    auto comp = [](const void* a, const void* b) ->int {return *(int*)a - *(int*)b; };
    //comp类型实际是一个函数指针类型,故上式也可写成如下
    //int (*comp) (const void* a, const void* b) = [](const void* a, const void* b) ->int {return *(int*)a - *(int*)b; };

    qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), comp);
    //打印
    for (int i = 0; i < 7; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;

}

sort函数使用lambda表达式

int main()
{
	int arr[] = { 5, 7, 1, 5, 6, 3, 2};    
    sort(arr, arr + sizeof(arr) / sizeof(arr[0]), [](int a, int b){return a < b; });
    //打印
    for (int i = 0; i < 7; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小朱同学..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值