C++ 利用sort对二维Vecotr排序

sort

我们都知道,在对一维数组或Vector排序,可以直接调用STL的算法sort进行排序。

vecotr<int> nums{1,4,2,3};
sort(nums.begin(),nums.end());//默认升序 从小到大
//sort(nums.begin(),nums.end(),greater());//降序 从大到小

二维数组排序

做题时,经常会遇到对二维数组排序。举个例子,现在有一个年级乱序数学成绩表sorce[class][sorce]

班级成绩
190
380
292
195
391
297

现在要求按照班级从小到大输出,同班级的按照成绩从大到小输出。

如果直接调用sort排序会得到,会得到一个按照出现顺序的排序,不符合要求。

	vector<vector<int>> nums1{{1,90},{3,80},{2,92},{1,95},{3,91},{2,97}};
	sort(nums1.begin(),nums1.end());

在这里插入图片描述

方法1: Lambda表达式

	vector<vector<int>> nums1{{1,90},{3,80},{2,92},{1,95},{3,91},{2,97}};
	sort(nums1.begin(),nums1.end(),[](vector<int> &a,vector<int> &b){
		return a[0]==b[0] ? a[1]>b[1] : a[0]<b[0];
	});

在这里插入图片描述

方法2:自定义函数

#include<bits/stdc++.h>
using namespace std;
//自定义函数
static bool mysort(vector<int> &a,vector<int> &b){
	if(a[0]==b[0])
		return a[1]>b[1];
	return a[0]>b[0];
} 
int main(){	
	vector<vector<int>> nums2{{1,90},{3,80},{2,92},{1,95},{3,91},{2,97}};
	sort(nums2.begin(),nums2.end(),mysort);
	for(auto x:nums2){//打印结果
		for(auto y:x)
			cout<<y<<" ";	
		cout<<endl;
	}
}

在这里插入图片描述

以上就是二维数组排序的实现方法,读者可以根据题目要求,修改Lamdad表达式和自定义函数中的 比较符号 实现。

#include<bits/stdc++.h>
using namespace std;

//自定义函数
static bool mysort(vector<int> &a,vector<int> &b){
	if(a[0]==b[0])
		return a[1]>b[1];
	return a[0]<b[0];
} 
//打印结果
void show(vector<vector<int>> temp){
	for(auto x:temp){
		for(auto y:x)
			cout<<y<<" ";	
		cout<<endl;
	}	
}
int main(){	

	vector<vector<int>> nums{{1,90},{3,80},{2,92},{1,95},{3,91},{2,97}};
	vector<vector<int>> nums1=nums;
	vector<vector<int>> nums2=nums;
	
	//直接调用sort
	sort(nums.begin(),nums.end());
	show(nums);
	
	//1. Lamdad表达式	
	cout<<endl<<"*******Lambda表达式*******"<<endl;
	sort(nums1.begin(),nums1.end(),[](vector<int> &a,vector<int> &b){
		return a[0]==b[0] ? a[1]>b[1] : a[0]<b[0];
	});
	show(nums1);
	
	//2.自定义函数
	cout<<endl<<"*******自定义函数*******"<<endl;
	sort(nums2.begin(),nums2.end(),mysort);
	show(nums2);
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值