STL set 对结构体某一特定元素排序 小记 新发现
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
typedef struct k
{
float math,English,chinese,sum;
string id,name;
}student;
bool operator < (const k &x,const k &y) 这个地方是重点,看好了是结构体外面,
{
if(x.sum==y.sum) 总成绩一样,按学号从小到大排序
return x.id<y.id;
else
return x.sum>y.sum;
}
int main()
{
freopen("1.txt","r",stdin);
set<student> a;
student b;
int n,m,j,i,k,t;
cin>>n;
for(i=0;i<n;i++)
{
cin>>b.name>>b.id>>b.chinese>>b.math>>b.English;
b.sum=b.chinese+b.math+b.English;
a.insert(b);
}
for(set<student>::iterator it=a.begin();it!=a.end();it++)
cout<<(*it).name<<" "<<(*it).id<<" "<<(*it).sum<<endl;
return 0;
}
下面这种排序
重载函数在结构体里面
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
typedef struct k
{
float math,English,chinese,sum;
string id,name;
bool operator < (const k &x)const 定义在里面,重载“<”是重载小于操作符,const Info &a 是引用,是传入参数,有const限制,不能修改
{
if(x.sum==sum)
return x.id>id; 请仔细观察这个大于号以及下面的判断sum的小于号,跟前面的完全不同,这是为什么呢?
else
return x.sum<sum; 小渣渣我才疏学浅,我只能这样理解:因为这是在结构体内,当然就和结构体外的就不一样啦。
} 结构体外,x.sum>y.sum就是让总成绩从大到小排序;但在结构体内,规矩就变了,return返回真即1
}student; 就按照参数列表,让引入的参数排到本地参数(按我的理解,这里x即为引入参数,当然,另一个就是本地参 数)后面,如果返回0,则否之。
int main() 小渣渣我,如果哪里有错,欢迎各位前来指正,不胜受恩感激
{
freopen("1.txt","r",stdin);
set<student> a;
student b;
int n,m,j,i,k,t;
cin>>n;
for(i=0;i<n;i++)
{
cin>>b.name>>b.id>>b.chinese>>b.math>>b.English;
b.sum=b.chinese+b.math+b.English;
a.insert(b);
}
for(set<student>::iterator it=a.begin();it!=a.end();it++)
cout<<(*it).name<<" "<<(*it).id<<" "<<(*it).sum<<endl;
return 0;
}