zoukankan      html  css  js  c++  java
  • 结构体或对象排序

    经常碰到结构体排序的问题,在此总结一下。
    以一个简单的例题开始:

    例1、有三个人(Person结构体),每个人都有name(string型)和age(int型)两个属性,现在需要按照下面的规则排序:先以姓名按从小到大排序(如abc<abd),如果姓名相同,则按照年龄从大到小排序。

    #include<iostream>
    #include<string>
    using namespace std;
    struct Person{
        string name;
        int age;
    };
    void exchange(Person &a,Person &b){
        //注意交换的时候,中间变量是结构体类型,而不是基本数据类型(int,char,string)等。
        Person temp;
        temp=a;
        a=b;
        b=temp;
    }
    int main(){
        Person p[3];
        int i,j;
        for(i=0;i<3;i++){
            cin>>p[i].name>>p[i].age;
        }
        //冒泡排序实现
        for(i=0;i<3;i++){
            for(j=0;j<3-i-1;j++){
                if(p[j].name>p[j+1].name){
                    exchange(p[j],p[j+1]);
                } else if(p[j].name==p[j+1].name){
                    if(p[j].age<p[j+1].age){
                        exchange(p[j],p[j+1]);
                    }
                }
            }
        }
        //依次输出
        for(i=0;i<3;i++){
            cout<<p[i].name<<' '<<p[i].age<<endl;
        }
    }
    

     这个代码是我最初写的,毫无技术含量,参加过ACM或者程序竞赛的朋友一看就知道这样做太复杂,因为有一个简单的sort函数,只要一行代码即可实现。

    sort函数首先是一个排序函数,不仅可以用来给数字排序,还可以给字符串排序,默认的是升序,如果需要降序的话,可以自己写一个cmp回调函数(函数名可自拟,通常用cmp),然后在sort函数中,加上(cmp)函数名即可。

    例2、随机产生10个数,并且从大到小输出

    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    bool cmp(int a,int b){
        return a>b;
    }
    using namespace std;
    int main(){
        int A[10],i;
        for(i=0;i<10;i++){
            A[i]=rand();
        }
        sort(A,A+10,cmp);
        for(i=0;i<10;i++){
            cout<<A[i]<<' ';
        }
    }
    

     注意:使用sort函数,必须要加#include<algorithm>头文件。在sort函数中,第一个参数为数组(字符串)名,第二个参数为排序范围,是从A到A+n(n为长度),第三个参数可省,省略后则代表默认升序,加上自己写的cmp函数,即可按照cmp中的规定进行排序。

    既然sort函数这么神奇,那他肯定也是可以对结构体或者对象进行排序的。比如例1可以用如下代码:

    #include<iostream>
    #include<algorithm>
    #include<string>
    using namespace std;
    struct Person{
        string name;
        int age;
    };
    bool cmp(Person a,Person b){
        if(a.name!=b.name){
            return a.name<b.name;
        } else {
            return a.age>b.age;
        }
    }
    int main(){
        Person p[3];
        int i,j;
        for(i=0;i<3;i++){
            cin>>p[i].name>>p[i].age;
        }
        //排序
        sort(p,p+3,cmp);
        //依次输出
        for(i=0;i<3;i++){
            cout<<p[i].name<<' '<<p[i].age<<endl;
        }
    }
    

    对于稍微简单的问题便可以用这种方法。如果问题稍复杂,也就是结构体中的属性太多了,于是在cmp函数中的判断语句就增加了,此时要注意写判断语句的时候一定要弄清楚先判断什么,在判断什么,怎么组织语句等。

    比如例3、在这里我们需要对N个人(Person)进行排序,规则如下:每个人有3个属性,name(string型),age(int型),height(int型)。优先按照name由大到小排名,name相同的则按照age由大到小排序,age相同的则按照height由大到小排序。

    #include<iostream>
    #include<algorithm>
    #include<string>
    using namespace std;
    struct Person{
        string name;
        int age;
        int height;
    };
    bool cmp(Person a,Person b){
        if(a.name!=b.name){
            return a.name>b.name;
        }
        if(a.name==b.name && a.age!=b.age){
            return a.age>b.age;
        }
        if(a.name==b.name && a.age==b.age){
            return a.height>b.height;
        }
    }
    int main(){
        int n;
        cin>>n;
        Person p[n];
        int i,j;
        for(i=0;i<n;i++){
            cin>>p[i].name>>p[i].age>>p[i].height;
        }
        //排序
        sort(p,p+n,cmp);
        //依次输出
        for(i=0;i<n;i++){
            cout<<p[i].name<<' '<<p[i].age<<' '<<p[i].height<<endl;
        }
    }
    

     其实,对于结构体或者对象排序时,最关键的是写cmp函数。另外,如果只是对一组数据(一串个数字或者字符串)反向排序后输出,如果只是关心输出,则可以取巧,直接用sort函数,不用写cmp回调函数,直接在输出的时候,从length-1开始倒序输出。

  • 相关阅读:
    video和audio
    H5-geolocation学习
    hammer.js学习
    echarts学习
    移动端手势识别
    SVG
    e.key && e.which && e.keyCode
    git中避免提交.DS_Store文件[转载]
    前端笔试题[1]
    Javascript实现格式化输出
  • 原文地址:https://www.cnblogs.com/-beyond/p/5902113.html
Copyright © 2011-2022 走看看