zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    JPEG/PNG/GIF图片格式简析
    js-JavaScript常见的创建对象的几种方式
    js-ES6学习笔记-let命令
    js-权威指南学习笔记21
    js-jQuery性能优化(二)
    【读书笔记】iOS-Apple的移动设备硬件
    【读书笔记】iOS-属性中的内存管理参数
    【读书笔记】iOS-自动释放池
    【读书笔记】iOS-分类与协议
    【读书笔记】iOS-动态类型和动态绑定
  • 原文地址:https://www.cnblogs.com/lan0725/p/3489441.html
Copyright © 2011-2022 走看看