C++结构体排序个人总结(运算符重定义,比较器)

前几天做蓝桥杯题目有一题有用到结构体排序,刚开始使用比较器,然后sort()排序一下就可以,后来参考别人的代码发现还可以用运算符重定义,着实省事很多,省的再在结构体外面写一个比较器的方法,所以现在总结一下:

第一种:结构体内重定义 (‘  <  ’符号),然后sort就可以排序

#include"iostream"
#include"algorithm"
using namespace std;
struct Node{
	
	int rank;
	bool operator<(const Node& n)const{//运算符重定义 
		return rank < n.rank;// rank > n.rank 降序  rank < n.rank 降序
	}
}node[3];
int main(){

	int n = 3;
	for(int i = 0;i < n;i++)
		node[i].rank = i;
	
	sort(node,node + n);
	for(int i = 0;i < n;i++)
		cout << node[i].rank << endl;
	
	return 0;
}
运行结果:升序( 降序只需要改成 rank  > n.rank


第二种:比较器(结构体外定义比较器,然后调用sort时把相应的比较器输入

#include"iostream"
#include"algorithm"
#include"vector"
using namespace std;
struct Node{

	int rank;
	bool operator<(const Node& n)const{//运算符重定义 
		return rank < n.rank;// rank > n.rank 降序  rank < n.rank 降序
	}
}node[3];
bool cmp(Node a,Node b){//比较器写法1
	return a.rank > b.rank;//排序规则同上
}
bool cmp_const(const Node& a,const Node& b){//比较器写法2
	return a.rank > b.rank;
}
int main(){

	int n = 3;
	for(int i = 0;i < n;i++)
		node[i].rank = i;

	sort(node, node + n,cmp_const);
	for(int i = 0;i < n;i++)
		cout << node[i].rank << endl;

	return 0;
}
运行结果同上

因为主修的不是C++,所以关于写法1,写法2有什么区别还不清楚,等过两天问老师才知道,但是运行结果一样

写法1,2的区别

为了限定隐含的this指针,
即这个成员函数不能修改其数据成员
一般在类中这样用,这个成员函数的功能多数是get数据成员,即获得对象的某个数据,只读不写相关文章连接


应用:vector排序应用

#include"iostream"
#include"algorithm"
#include"vector"
using namespace std;
struct Node{

	int rank;
	bool operator<(const Node& n)const{//运算符重定义 
		return rank > n.rank;// rank > n.rank 降序  rank < n.rank 降序
	}
}node[3];
bool cmp(Node a,Node b){//比较器写法1
	return a.rank > b.rank;//排序规则同上
}
bool cmp_const(const Node& a,const Node& b){//比较器写法2
	return a.rank > b.rank;
}
int main(){
	vector<Node> v;
	int n = 3;
	for(int i = 0;i < n;i++)
		node[i].rank = i;

	for(int i = 0;i < n;i++)
		v.push_back(node[i]);

	sort(v.begin(), v.end());//操作符重定义
	//sort(v.begin(), v.end(),cmp);//比较器1
	//sort(v.begin(), v.end(),cmp_const);//比较器2
	for(int i = 0;i < n;i++)
		cout << v[i].rank << endl;

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值