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