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。
通过参考这个,我个人觉得函数对象的方法使用最方便,维护量少,而且统一。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号