一、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); //降序