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

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值