C++的vector二维数组按第二维进行排序

问题引入

在Leetcode452中遇到了二维数组排序的问题,其中每个气球的区间范围是用一个vector<int>来存储的,最后用一个vector<vector<int>>来存储所有气球的横向区间。
leet在这里插入图片描述
这里想对所有的气球横向区间以结束位置进行排序。

基础知识

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();};

猜你喜欢

转载自blog.csdn.net/ZHorcrux/article/details/129326728