有两个key的数据结构,用map作为数据存储std
来源:互联网 发布:平面广告设计软件有哪些 编辑:程序博客网 时间:2024/06/05 15:35
map作为一个常用的std,其基本用法就是key,value
一般key就是一个整型数据,value要么是一个对象数据要么是一个对象/结构体。
存储关系类型的数据,比如好友数据,一般用法是:
std::map<好友ID,好友数据> 就是把这个map数据放置到玩家身上,但是这样会势必造成玩家类的臃肿,
比较好的方法是将数据提取出来作为一个好友关系类,来管理所有玩家好友数据
但是这要就必然造成两个key来确定好友数据,
很傻的方式就是map < 玩家ID,map < 好友ID,好友数据 > >固然可以实现数据存储,但是有更好的方法:
std::pair
struct FriendData{ int nID; char szName[32];};// 定义玩家ID和好友ID组合的keytypedef std::pair<int,int> KEY_ID_PAIR;typedef std::map<KEY_ID_PAIR, FriendData*, std::less<KEY_ID_PAIR> > MAP_FRIEND;class FriendShip{public:
void InsertFriend(int nPlayerID, int nFriendID, FriendData* pFriendData) { m_sFriendMgr.insert(std::pair<KEY_ID_PAIR, FriendData*>(KEY_ID_PAIR(nPlayerID, nFriendID), pFriendData)); } FriendData* GetFriend(int nPlayerID, int nFriendID) { MAP_FRIEND::iterator itr; itr = m_sFriendMgr.find(KEY_ID_PAIR(nPlayerID, nFriendID)); return itr->second; }private: MAP_FRIEND m_sFriendMgr;};
这是如果要查找某个玩家的好友列表怎么办呢?
map我们都知道它是个平衡二叉树,数据都是有序存放的,这里我就不在详细叙述它内部是怎么实现的,我们只要知道它的内部的数据是有序存放的就行了
还是那句,如果要查找某个玩家的好友列表怎么办?这里就用到map的一个成员函数:
lower_bound
lower_bound百度百科是怎么解释的:
lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个不小于value 的值
我们可以通过这个取得玩家的好友列表
void GetPlayerFriendShip(int nPlayerID, std::vector<int> vecFriendID) { MAP_FRIEND::iterator itrBegin; MAP_FRIEND::iterator itrEnd; itrBegin = m_sFriendMgr.lower_bound(KEY_ID_PAIR(nPlayerID, 0)); itrEnd = m_sFriendMgr.lower_bound(KEY_ID_PAIR(nPlayerID + 1, 0)); for (; itrBegin != itrEnd; ++itrBegin) { vecFriendID.push_back(itrBegin->second->nID); } }
这样就可以获取到玩家好友数据
其实这里还可以更好的方式获取到玩家的好友列表
// 定义一个接受玩家ID的结构体struct _GetIDArrayFunc{ _GetIDArrayFunc() { m_vecFrienID.clear(); }; void operator ()(int dwPlayerID, int nFriendID) { m_vecFrienID.push_back(nFriendID); }; std::vector<int> m_vecFrienID;};
// 定义一个玩家好友关系获取成员函数模版 template<class TFunc> void TraverseFreindShipID(int nPlayerID, TFunc& Func) { MAP_FRIEND::iterator itrBegin; MAP_FRIEND::iterator itrEnd; itrBegin = m_sFriendMgr.lower_bound(KEY_ID_PAIR(nPlayerID, 0)); itrEnd = m_sFriendMgr.lower_bound(KEY_ID_PAIR(nPlayerID + 1, 0)); for (; itrBegin != itrEnd; ++itrBegin) { KEY_ID_PAIR rKey = itrBegin->first; Func(rKey.first, rKey.second); } }
TraverseFreindShipID用于获取玩家数据的成员函数,可以复用
_GetIDArrayFunc获取玩家数据的结构体,可以根据不同筛选条件定义不通的结构体来获取玩家数据
阅读全文
0 0
- 有两个key的数据结构,用map作为数据存储std
- 用 char*作为std::map中的key
- 使用用户自定义类型作为std::map的key
- 用仿函数实现以std::string作为key的map自定义排序
- Range作为map的Key
- struct作为map的key
- 用自定义的对象作为Map的key
- 判断 std 中的 map 中是否有 key
- byte[]作为Map key的问题
- C++学习笔记-----std::pair作为unordered_map的key
- std::map key=std::pair
- 使用用户自定义类型作为std::map的…
- std::map对模板参数key的要求
- 求两个map之间key的交集
- 由“用存放中文字符串的vector作为map的key”引出“严格弱序要求”
- byte[]数组作为map的key的问题
- 从标准输入中读取两个字符串 name:表示姓名,hobby:爱好;name作为key;hobby作为Value存入Map 然后根据姓名取得Value并打印,再根据name值删除map中的数据再打印ma
- MyBatis根据Map中key作为字段名,value作为字段值修改数据
- Linux常用基础命令
- PHP数组转XML 递归
- 定时器
- 数据分析—工具箱
- ubuntu16.06(64位)下搭建nuc972开发环境
- 有两个key的数据结构,用map作为数据存储std
- 51nod 1765 谷歌的恐龙
- 子线程中真的不能更新UI?
- 阿里云搭建lamp环境配置详解_01
- 做一个好设计,写一手好程序,经营一个好产品
- java基础教程知识点
- xampp软件
- HTTP返回结果状态码小结
- 人工智能浪潮之下普通程序员如何入门AI?