我有一个管理游戏用户的C ++服务器。这些用户拥有唯一的AccountID,服务器上用户的几乎所有查找都涉及从全球地图中查找用户
std::map<unsigned int, User*>
其中unsigned int是AccountID。除了这个我正在实现朋友列表的新案例之外,这很有效。为了将朋友添加到某人朋友列表,需要通过用户名来完成。当用户名邀请人们加入聊天室或其他“派对”类型的活动时,我也遇到了这个问题。
我目前的两个选项是:
1)遍历整个用户地图,按用户名进行字符串比较。
2)对索引的Username列进行数据库查找并返回AccountID,然后为User *执行map查找。
这两种解决方案都效率很低。我正在寻找一个更优化的用户名查找用户的解决方案。
想到的第一个想法是Hashtable,它在用户名上散列,但后来我有两个不同的数据结构(Hashtable和Map)正在做同样的事情,除了一个是AccountID,一个是名字
第二种选择可能是使用用户名作为地图的关键,尽管我无法想象有一个字符串使得某个关键字效率太高。
关于我应该在这做什么的任何建议?至于服务器上的更多信息,将有大约1000多个用户,他们将不断离开和加入。
答案 0 :(得分:4)
C ++ 11有std::unordered_map
,可自动为您处理散列,例如std::unordered_map<std::string, User*>
。
答案 1 :(得分:0)
我建议只使用另一张地图std::map<std::string, User*>
。我相信对于拥有约1000个用户的应用程序来说,使用散列图或更复杂的解决方案是过度工程化的,基于字符串的映射查找不会那么昂贵,与数据库中的查找相比几乎为零。
也许,您可以使用在某处按字母顺序排序用户的副产品。