前几天做蓝桥杯题目有一题有用到结构体排序,刚开始使用比较器,然后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;
}