qsort函数
- qsort函数为C语言标准库函数,包含在<cstdlib>头中,其涉及各种类型的排序,可将基本排序问题转化为比较大小的问题:
- qsort(排序首指针,排序个数,单个元素字节数,比较函数)
- 其形参的参数包括自定义比较函数的调用,可采用指向函数的指针进行操作
- 编写比较函数的格式已经被限定,形参为两个 const void* 的指针,返回值为int,且第一个参数大于第二个参数返回正数,相等返回0, 否则返回负数, 故对于字符串的比较可以套用strcmp函数, 但不可将其直接作为比较函数使用(-_-参数格式不对)
- 只要能给出比较函数,qsort函数几乎能完成任何类型的排序
- qsort函数的四个参数分别为:第一个排序元素的指针,排序元素的个数,每个元素的字节数,比较函数的地址(二三参数可结合sizeof使用)
- qsort函数可以用于部分元素的排序,用第一、二个参数控制就行
注:编写compare函数时,记得对传入的指针参数取值后进行比较,而不是比较指针本身
#include <iostream>
#include <cstdlib>
int compare(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
int main(void) {
int arr[5] = { 1,3,2,5,4 };
std::qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), compare);
}
sort函数
- 功能同qsort函数,但适用范围更广,sort函数包含在<algorithm>头中,sort函数功能由模板实现,相较于qsort运行效率较高:
- sort(排序首指针,排序尾指针,比较函数)
- sort函数的参数有三个,第一个是排序元素的首个元素地址,第二个是排序元素的尾元素地址,第三个是比较函数,不同于qsort函数,sort函数的比较函数形参不能是指针,可以是引用或者形参变量,返回值一般为bool类型,也可以为int
#include <iostream>
#include <array>
#include <algorithm>
int main(void) {
std::array<int, 5> arr = { 1,3,2,5,4 };
std::sort(arr.begin(), arr.end(), [](int m, int n)->bool {return m < n;});
}
lambda表达式
-
用于仅使用一次的函数的就地定义形式,如上面qsort和sort函数的compare函数就可以定义为lambda函数
-
格式: [capture] (parameters) mutable ->return-type {statement}
- [capture] :捕捉列表。捕捉列表总是作为lambda的开始,即出现于lambda的开始处。它是lambda的引出符(即开始标志)。编译器可以根据该“标志”来作出判断出该函数是否为lambda函数。同时“捕捉列表”能够捕捉上下文中的变量以作为lambda函数使用。
- (parameters):参数列表。和C/C++中的普通函数参数意义一样。该部分是可选的,意味着如果我们不需要进行参数传递时,可以连同括号“()”一起省略掉。
- mutable:该关键字为一个修饰符。在默认的情况下,lambda函数总是返回一个const,而当我们在参数列表后面注明了“mutable”关键字之后,则可以取消其常量性质。若在lambda中使用了mutable修饰符,则“参数列表”是不可省略掉的(即使是参数为空)
- ->return-type: 函数的返回值类型。和C/C++中的普通函数返回值类型的性质一样。主要目的是用来追踪lambda函数(有返回值情况下)的返回类型。若lambda函数不需要返回值,则可以直接将这部分省略掉。
- {statement}:函数体。在该函数体中,除了可以使用参数列表中的变量外,还可以使用所有捕获到的变量(即[capture] 中的变量)。
//e.g. 对于int[]的sort比较函数使用lambda函数; [](int& mm,int& nn)->bool{return mm < nn;} //从小到大 [](int& mm,int& nn)->bool{return mm > nn;} //从大到小