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。
通过参考这个,我个人觉得函数对象的方法使用最方便,维护量少,而且统一。
C++ Vector 中自定义对象的排序的更多相关文章
- 【转载】C#中自定义Sort的排序规则IComparable接口
C#中的List集合在排序的时候,如果不使用Lambda表达式进行排序的话,一般调用Sort()方法进行排序,如果希望Sort()方法排序后的结果跟我们预想的效果一致或者按照我们自定义的规则排序,则需 ...
- NSArray中的对象进行排序
看在iOS中有哪些方法可以对NSArray中的对象进行排序.下面是目录: 小引 使用NSComparator进行排序 使用NSDescriptor进行排序 使用selector进行排序 小引 我们将要 ...
- Java基础知识强化之集合框架笔记69:Collections类之ArrayList存储自自定义对象并排序的案例
1. ArrayList存储自自定义对象并排序的案例: ArrayList存储自自定义对象,并使用Collections对ArrayList存储基本包装类的元素排序. 2. 代码实现: (1)Stud ...
- std list/vector sort 自定义类的排序就是这么简单
所以,自己研究了一下,如下:三种方式都可以,如重写<,()和写比较函数compare_index.但是要注意对象和对象指针的排序区别. 1.容器中是对象时,用操作符<或者比较函数,比较函数 ...
- 对list集合中的对象进行排序(转载)
原文链接:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元 ...
- List自定义对象的排序,根据对象的某一列进行排序
在工作中,经常需要对List对象集合进行排序操作,下面总结下搞个通用排序对象,原理是使用JAVA的 Comparator 接口实现排序 不多说直接上“干货” 1.存在实体类: @Data @ ...
- 根据Value对Map中的对象进行排序
背景 SortedMap的实现类TreeMap可以按自然顺序或自定义顺序遍历键(key),有时我们需要根据值(Value)进行排序,本文提供了一种简单实现思路. 实现 Comparator接口 使用V ...
- 如何根据对象的属性,对集合(list / set)中的对象进行排序
一:针对list 通过java.util.Collections的sort方法,有2个参数,第一个参数是list对象,第二个参数是new Comparator<对象类>(){}方法,这 ...
- 根据List集合中的对象属性排序
首先创建一个Student对象,里面有三个属性,分别是int类型,String类型,Date类型 package com.sinoway.cisp.test; import java.text.Sim ...
随机推荐
- ubuntu 安装lua错误
转自:http://www.cnblogs.com/softidea/archive/2016/03/02/5236498.html lua.c:80:31: fatal error: readlin ...
- Python 时间推进器-->在当前时间的基础上推前n天 | CST时间转化标准日期格式
由于公司任务紧迫,好久没有在园子里写自己的心得了,今天偷个闲发表点简单的代码块,在开源的时代贡献微薄力量.话不多说,直接上代码块: ]) m = ]) d = ]) the_date = dateti ...
- [计算机网络-传输层] 面向连接的传输:TCP
参考:http://blog.csdn.net/macdroid/article/details/49070185 在学习TCP之前我们先来看一下可靠数据传输需要提供什么样的机制: ·差错检测机制:检 ...
- NOI 97 (Vijos 1464)积木游戏(DP)
很普通的DP,设dp[i][j][k]为第i块积木放在第j堆且摆放状态为k的最高高度.方程很容易推出. # include <cstdio> # include <cstring&g ...
- BZOJ4240 有趣的家庭菜园(贪心+树状数组)
显然相当于使序列变成单峰.给原序列每个数按位置标号,则要求重排后的序列原标号的逆序对数最少.考虑将数从大到小放进新序列,那么贪心的考虑放在左边还是右边即可,因为更小的数一定会在其两侧,与它自身放在哪无 ...
- 【以前的空间】poj 2288 Islands and Bridges
一个不错的题解 : http://blog.csdn.net/accry/article/details/6607703 这是一道状态压缩.每个点有一个值,我们最后要求一个最值sum.sum由三部分组 ...
- BZOJ1502:[NOI2005]月下柠檬树——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1502 https://www.luogu.org/problemnew/show/P4207 李哲 ...
- 20165218 预备作业3 Linux安装及学习
Linux安装及学习 第二节 基本概念及操作 1. 关于图形界面 Linux本身是没有图形界面的,对于初学者来说,这或许是其与Windows系统最直观的差别.Linux所呈现给用户的实际上是一个实现图 ...
- 关于EK Dicnic
笔记--最大流 $EK$ $Dinic$ $EK$: 运用反向边可以给当前图一次反悔的机会,就是其实现在的增广路并不是最优的,然后就$bfs$找增广路即可 $Dicnic$: 我们发现其实每一次先$ ...
- mybaties实体的 Mapper.xml文件中自定义sql时模糊查询的写法
<select id=selectByNameLike" parameterType="string" resultMap="BaseResultMap ...