我想在一些容器中保存锦标赛的结果.对于每场比赛,我需要存储球员的名字和一些积分.例如:
map["player1:player2"] = {2,4};
Run Code Online (Sandbox Code Playgroud)
我想从这个容器中检索不仅仅是通过键"player1:player2"
,甚至是通过反向键"player2:player1"
,我想获得反向结果.
我即将使用std::map
并制作一些智能包装.也许有一些技巧使用自定义比较器,自定义检索和保存功能.
这是std::map
一个很好的选择还是其他更好的选择?
编辑:
我将这些评论总结为解决方案,如下所示:
struct Match
{
std::string player1;
std::string player2;
int pointsPlayer1;
int pointsPlayer2;
std::string getKey()
{
return player1 + ":" + player2;
}
Match reverse()
{
Match reversed;
reversed.player1 = player2;
reversed.player2 = player1;
reversed.pointsPlayer1 = pointsPlayer2;
reversed.pointsPlayer2 = pointsPlayer1;
return reversed;
}
};
class Tournament
{
std::map<std::string, Match> _games;
public:
void insert(Match match);
};
void Tournament::insert(Match match)
{
_games.insert({ match.getKey(), match });
Match reversed = match.reverse();
_games.insert({ reversed.getKey(), reversed });
}
Run Code Online (Sandbox Code Playgroud)
我选择了更简单的方法,我不介意每个结果都有两次,因为insert函数每次都替换匹配的两个,封装可以保证这个(它不暴露指针,只是struct).
首先,使用 astd::map
不起作用。原因很简单,你想插入map["player1:player2"] = {2, 4};
其中,但从那时起,{4, 2}
当你请求它时,你需要它返回map["player2:player1"]
。因此,您不仅需要不同的键来引用相同的数据(这std::map
可以为您提供自定义比较器),而且还需要根据键中的顺序采用不同格式的相同数据,这是std::map
不可能的。
现在,如何解决这个问题?首先,考虑您需要的界面。目前,您有插入和查询锦标赛结果的函数。我的水晶球还告诉我,您将想要迭代锦标赛中的所有结果,查询比赛是否已经发生,并且可能重置表格的内容。因此,首先写下这些函数的接口并记录它们的行为,尤其是对于极端情况。
然后,考虑如何实施。最直接的方法可能是使用 amap<pair<string,string>, pair<int,int>>
来存储分数。现在,在插入时,您可以冗余地存储结果(即存储“player1:player2”和“player2:player1”的分数),然后在使用任一变体进行检索时都会给出正确的结果。或者,标准化顺序(按字典顺序对玩家进行排序),并在检索时,可以选择反转查找前键的顺序和查找后结果的顺序,以获得正确的顺序。
笔记:
map<string, map<string, int>>
. 要插入匹配结果,您只需执行res["player1"]["player2"] = 2;
和res["player2"]["player1"] = 4;
。我不会这样做,除非作为上述接口背后的实现。