qsort 回调函数解惑

一、qsort 的回调函数

1、函数指针

int func(int a);
int (*f)(int a);
f = func;      //函数指针赋值方式1
f = &func;     //函数指针赋值方式2。注意这里并不会取到二级指针,效果和上一行完全相同,说是编译器
               //优化过了,见下面的解释。得到官方解释后再回来这里补充

参考链接:函数名取地址并不会产生二级指针的验证,但并没有给出定义性质的解释

2、回调函数

我们调用别人写好的函数 (API, Application Programming Interface) 时,称为 call;如果别人写好的库函数调用我们的函数,就叫CallBack。

3、qsort函数原型

void qsort(void* base,         //指向需要排序的数组
		   size_t n_elements,  //指定数组中元素的数目
		   size_t el_size,     //指定每个元素的长度,以字节为单位
		   int (*compare)(const void*, const void*)   //函数指针
		   );

//调用
qsort(nums, 100, sizeof(nums[0]), compare_int);

4、上述回调函数 compare_int 的定义

int compare_int(const void*a,const void*b)
{
	return *(int*)a - *(int*)b;
}

qsort 函数根据 compare_int 的返回值来决定a、b的位置交换与否:
> 0 交换
≤ 0 不交换
注:默认一开始a在低索引位置,b在高索引位置

compare_int 的函数体决定升序还是降序:
a - b 升序
b - a 降序
注:这里就是由用户决定的了

需要在 compare_int 函数内部会将const void* 型强制转换成实际类型。两个参数都是指针,指针的类型是void const*,const的意思是不能修改指针所指向的内容,void是“无类型”的意思,无类型的指针是无法使用的,使用前必须进行强制类型转换,转换为指向某种数据类型的指针。

二、vector::sort() 的回调函数

int cmp(int a, int b){
	return a > b;  //降序排序
    //retur a < b; //升序排序
}

调用:

vector<int> nums;
nums.insert(3);
nums.insert(5);
nums.insert(4);
nums.sort(nums.begin(), nums.end(), cmp); //降序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值