问题引入
在Leetcode452中遇到了二维数组排序的问题,其中每个气球的区间范围是用一个vector<int>来存储的,最后用一个vector<vector<int>>来存储所有气球的横向区间。
这里想对所有的气球横向区间以结束位置进行排序。
基础知识
1、sort函数的用法
sort(start, end, cmp);
- start是要排序的数组的起始位置,end是要排序数组的结束位置的下一位
- cmp指出了排序准则,若cmp缺省,则默认为升序排序
sort函数的强大之处在于可以和cmp结合,实现多维vector数组的按某一维或某几维排序;示例如下:
bool cmp(int a, int b){
return a > b;
//意味着a大于b时,把a排到b的前面,即降序排序
}
int a[];
sort(a,a+10,cmp);
//实现了将数组a的前十位降序排序
bool cmp(vector<int> &a,vector<int> &b){
//传入两个vector数组
return a.back() < b.back();
//根据数组元素的最后一位进行降序排序
}
vector<vector<int>> points;
sort(points.begin(),points.end(),cmp);
//对二维数组points,按照第二维进行排序
需要注意的点是:
- cmp函数中比较的元素就应该是待排序数组最外层里面的内容
- sort中传入的就是要排序的整个数组的起始位置和终止位置和排序准则cmp
2、lambda表达式
- lambda表达式定义了一个匿名函数,这个函数可以用一行实现
函数格式如下:
[capture](params) opt -> ret {body;};
- capture实现了一定范围的变量的捕获,不捕获变量时可以缺省
- params是参数列表,没有参数列表时可以缺省
opt是函数选项- ret是返回值类型,若可以推测可以缺省
- body;是函数体中的内容,不应缺省
一般来说lambda表达式比自定义函数的方法要慢!!
原问题的解
虽然上文介绍了对数组进行排序的两种形式,但其内涵都是使用了cmp函数对排序的准则做出了规定。只不过lambda表达式使用的是隐含的函数定义。
1、定义cmp的sort函数
bool cmp(vector<int> &a, vector<int> &b){
return a.back() < b.back();
//意味着当a的最后一位比b的最后一位小时,将a排序到b前,即实现了升序排序
}
vector<vector<int>>points;
sort(points.begin(),points.end(),cmp);
2、使用了lambda表达式的sort函数(其实就是将cmp函数隐含到sort里面)
sort(points.begin(),points.end(),[](vector<int>a,vector<int>b){return a.back() < b.back();};