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

news2024/12/26 3:13:00

目录

目录

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

凝心聚力 开源共建 | 统信软件参与成立OpenKunlun开源固件社区

11月22日&#xff0c;统信软件携手国内固件厂商、处理器厂商、外设板卡厂商等数十家产业同仁参与共建的OpenKunlun开源固件社区正式成立&#xff01; OpenKunlun社区是在自愿、开源、平等和协作的基础上&#xff0c;由基础软硬件企业、高等院校、个人开发者共同参与的非营利性开…

STM32——STM32中断系统与EXTI外部中断

文章目录一、中断系统二、STM32中断系统三、NVIC&#xff08;嵌套中断向量控制器&#xff09;NVIC基本结构NVIC优先级分组四、EXTI&#xff08;外部中断&#xff09;EXTI简介EXTI基本结构AFIO复用IO口EXTI框图五、对射式红外传感器计次电路设计关键函数EXTI库函数文件&#xff…

SpringMVC与SpringBoot响应请求的流程

SpringMVC是基于Servlet的MVC模型&#xff0c;Model&#xff1a;一个或多个javabean对象&#xff0c;用于存储数据和业务逻辑&#xff1b;View&#xff1a;一个或多个jsp页面&#xff0c;拿到控制器提交的数据为模型提供数据显示&#xff1b;Controller&#xff1a;一个或多个s…

【消息中间件】RabbitMQ的工作模式

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;深入、全面、系统的介绍消息中间件 &#x1f330; 文章简介&#xff1a;本文将介绍RabbitMQ的工作模式 &#x1f353…

cubeIDE开发, stm32的CRC计算CubeMX配置及HAL库底层实现分析

一、stm32的CRC 1.1 CRC的简介及MCU关联说明 STM32的CRC(Cyclic Redundancy Check&#xff0c;循环冗余校验)计算单元使用一个固定的多项式发生器&#xff0c;从一个32位的数据字产生一个CRC码。在业务开发应用中&#xff0c;会基于CRC的技术用于验证数据传输或存储完整性。在E…

【python基础_05】面向对象1_对象和类、魔术方法

文章目录1. 类和对象1.1 使用对象组织数据的模版1.2 成员变量和成员方法1.3 实现代码2. 内置方法&#xff08;魔术方法&#xff09;2.1 构造方法&#xff1a; __init__()2.2 __call__()2.3 __len__()2.3 __str__()2.4 __getitem__()2.5 __setitem__()2.6 __delitem__()2.7 __lt…

【从零开始学习深度学习】35. 门控循环神经网络之门控循环单元(gated recurrent unit,GRU)介绍、Pytorch实现GRU并进行训练预测

在循环神经网络中&#xff0c;当时间步数较大或者时间步较小时&#xff0c;循环神经网络的梯度较容易出现衰减或爆炸。上一篇文章中介绍的裁剪梯度可以应对梯度爆炸&#xff0c;但无法解决梯度衰减的问题。因此&#xff0c;循环神经网络在实际中较难捕捉时间序列中时间步距离较…

Elastic-Job分布式任务调度(1):概述

1 什么是任务调度 我们可以先思考一下下面业务场景的解决方案&#xff1a; 某电商系统需要在每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券。某银行系统需要在信用卡到期还款日的前三天进行短信提醒。某财务系统需要在每天凌晨0:10结算前一天的财务数据…

【自学Python】Linux安装Python

Linux安装Python Python下载 Python下载地址 https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xzPython下载 我们在 Linux 终端中&#xff0c;直接使用 wget 命令&#xff0c;下载 Linux 版 Python 的安装包&#xff0c;我们在终端输入以下命令&#xff1a; wg…

PAT乙级|1094 谷歌的招聘

题源https://pintia.cn/problem-sets/994805260223102976/exam/problems/1071785997033074688 提交1&#xff1a;一个用例没过 提交2&#xff1a;AC 错因&#xff1a;输出需为字符串&#xff0c;例如在 200236 中找 4 位素数&#xff0c;解是0023 关键&#xff1a;第33行代码…

linphone android sdk 源码下载编译

前言 前面的有写过Android 使用Linphone SDK开发SIP客户端相关的文章, 在后续的开发过程中, 为了更深入了解linphone, 便尝试下载SDK源码自行编译. 关于linphone这里不作过多介绍, 可以参考前面的文章. Linphone-SDK 是一个将 Liblinphone 及其依赖项捆绑为 git 子模块的项目&a…

HTC FOCUS3在PC端串流FOHEART H1数据手套(手柄)

本教程介绍使用FOHEART H1数据手套与HTC手柄驱动VR中的虚拟手运动&#xff0c;实现手部的追踪及定位。 本教程内容与之前使用腕带定位&#xff08;HTC FOCUS3在PC端串流FOHEART H1数据手套&#xff08;腕带&#xff09;&#xff09;不同&#xff0c;这次我们使用头显中自带的…

【Kuangbin简单DP】挤奶时间

4561. 挤奶时间 - AcWing题库 题意&#xff1a; 思路&#xff1a; 一开始的思路是把这么多的区间当作物品&#xff0c;然后选与不选&#xff0c;这样去搞线性DP 显然是不行的&#xff0c;因为这样答案就不知道怎么统计了 而且&#xff0c;我们是设阶段&#xff01;&#xf…

HSK汉语考试变革,您需要了解以下几点

2023年HSK考试可能有哪些变化汉语考试难度增加了还是减低了&#xff1f; 对现在的课程和教材有影响&#xff1f; 汉语老师怎么样应对&#xff1f;HSK考试变化猜想1.HSK3级考试和HSKK初级结合在一起 2.HSK4级考试和HSKK中级结合在一起 3.HSK5,6级考试和HSKK高级结合在一起HSKK考…

INTERSPEECH 2022|面向零样本声音克隆的内容相关细粒度说话人表征方法

本文由清华大学与腾讯 AI Lab、香港中文大学合作。 零样本说话人自适应&#xff08;zero-shot speaker adaptation&#xff09;&#xff0c;或称为零样本声音克隆&#xff0c;旨在根据任意一条参考语音&#xff08;reference speech&#xff09;合成训练过程中从未见过的说话人…

Leetcode:239. 滑动窗口最大值(C++)

目录 问题描述&#xff1a; 实现代码和解析&#xff1a; 暴力法&#xff08;会超时&#xff09;&#xff1a; 原理思路&#xff1a; 单调队列法&#xff1a; 原理思路&#xff1a; 单调队列&#xff1a; 模拟过程&#xff1a; 问题描述&#xff1a; 给你一个整数数组…

Python基础知识(二)

目录 顺序语句 条件语句 条件语句书写格式一及对比&#xff1a;if条件语句 条件语句书写格式二及对比&#xff1a;if...else...语句 条件语句书写格式三及对比&#xff1a;if...elif...else语句 空语句pass 条件语句的总结&#xff1a; 循环语句 while循环 与c/java/…

对于Muduo主从Reactor模式的理解

从12月20号开始看Muduo网络库&#xff0c;到28号的时候弄懂了EventLoop, Poller, Channel是怎么一回事&#xff0c;一番琢磨之后觉得还是应该发到博客上跟大家分享&#xff0c;特此记录。 对照linyacool那个webserver的实现&#xff0c;再看了一遍muduo的EventLoop, Poller ,C…

IDEA快速启动多个微服务模块 -idea如何开启Run DashBoard

文章目录 缘起 Run DashBoard面板如何开启开启 Run DashBoard 注意&#xff1a; 缘起 在idea里面如果需要启动多个项目的话&#xff0c;尤其是是比如微服务项目&#xff0c;动辄要启动五六个七八个应用&#xff0c;如果通过右上角那边启动会很不方便&#xff0c;你需要选择…

基于GIS简单处理世界土壤数据库(HWSD)的中国土壤数据集

来源&#xff1a;GIS前沿 一、 数据介绍 土壤属性表主要字段包括&#xff08;图1&#xff09;&#xff1a;详细描述请参考Harmonized World Soil Database (version 1.1).pdf文件&#xff0c;其中以T开头的土壤属性表示土壤上层的属性&#xff08;0-30cm&#xff09;&#xff…