• C++ Vector 中自定义对象的排序


    需求:

    客户端收到游戏中的所有联盟列表,现在需要按联盟的属性比如lv来进行排序。

    数据存储:

    每个联盟数据是一个对象,所有的联盟列表存在一个vector容器里面。

    老的解决方法:

    冒泡排序方法算法

    新的方法:

    参考http://blog.csdn.net/aastoneaa/article/details/8471722,总结使用C++自带的std::sort函数。

    详细方法:

    军团对象,定义了军团的各种简单属性

    class AllianceData
    {
    public:
        AllianceData();
    
        ~AllianceData();
    
        std::string uid;//唯一key
    
        std::string aname;//名称
    
        nv_uint32 num;//成员总数
    
        nv_uint32 alv;//等级
    };
    

     定义用来比较的函数对象,我们命名为CompHelper.h

    #ifndef _CompHelper_H_
    #define _CompHelper_H_
    
    #include "AllianceData.h"
    //升序排列 class CompLess { public: bool operator ()(const AllianceData& pstItem1, const AllianceData pstItem2) { return pstItem1.alv < pstItem2.alv; }
    }; //降序排列 class CompGreater { public: bool operator ()(const AllianceData& pstItem1, const AllianceData& pstItem2) { return pstItem1.alv > pstItem2.alv; } }; #endif // _CompHelper_H_

     我们调用时这样:

        std::vector<AllianceData> v_a;
        AllianceData m;
        m.uid = "1";
        m.aname ="name1";
        m.alv = 6;
        v_a.push_back(m);
        m.uid = "1";
        m.aname ="name1";
        m.alv = 6;
        v_a.push_back(m);
        m.uid = "1";
        m.aname ="name1";
        m.alv = 6;
        v_a.push_back(m);
        sort(v_a.begin(),v_a.end(),CompGreater());//降序排列
    

     假如你又要对已有的装备排序,那么可直接在CompHelper.h 中重载()方法即可,比如:

    #ifndef _CompHeloer_H_
    #define _CompHeloer_H_
    
    #include "AllianceData.h"
    #include "ArmyData.h"
    #include "EquipmentData.h"
    
    //升序排列
    class CompLess  
    {  
    public:  
        bool operator ()(const AllianceData& pstItem1, const AllianceData pstItem2)  
        {  
            return pstItem1.alv < pstItem2.alv;  
        }  
        bool operator ()(const CommanderData& pstItem1, const CommanderData pstItem2)  
        {  
            return pstItem1.lv < pstItem2.lv;  
        }  
        bool operator ()(const EquipmentData& pstItem1, const EquipmentData pstItem2)  
        {  
            return pstItem1.eid < pstItem2.eid;  
        }  
    }; 
    //降序排列
    class CompGreater  
    {  
    public:  
        bool operator ()(const AllianceData& pstItem1, const AllianceData& pstItem2)  
        {  
            return pstItem1.alv > pstItem2.alv;  
        }  
        bool operator ()(const CommanderData& pstItem1, const CommanderData pstItem2)  
        {  
            return pstItem1.lv > pstItem2.lv;  
        }  
        bool operator ()(const EquipmentData& pstItem1, const EquipmentData pstItem2)  
        {  
            return pstItem1.eid > pstItem2.eid;  
        }  
    };  
    
    
    #endif // _CompHeloer_H_
    

     总结:

    排序的方法有很多中,可参考http://blog.csdn.net/aastoneaa/article/details/8471722

    通过参考这个,我个人觉得函数对象的方法使用最方便,维护量少,而且统一。

  • 相关阅读:
    regsvr32.exe使用详解
    Windows默认文件操作(SHFileOperation)
    远程唤醒
    delphi事务
    rar行命令
    命令前加./ ,在后台运行程序 linux批处理 linux自动运行程序
    javascript基础知识(1)
    (三) MySQL事务与锁机制
    代码风格 java
    一切之始 java
  • 原文地址:https://www.cnblogs.com/lan0725/p/3489441.html
Copyright © 2020-2023  润新知