【发布时间】:2015-05-03 04:31:38
【问题描述】:
我想将锦标赛结果保存在某个容器中。对于每场比赛,我都需要存储球员的姓名和分数。例如:
map["player1:player2"] = {2,4};
我不仅想通过键 "player1:player2" 甚至通过逆键 "player2:player1" 从这个容器中检索,而且我想得到逆向结果。
我即将使用std::map 并围绕它制作一些智能包装器。也许有一些使用自定义比较器、自定义检索和保存函数的技巧。
std::map 是一个不错的选择还是其他更好的选择?
编辑:
我将这些 cmets 总结为如下所示的解决方案:
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 });
}
我选择更简单的方法,我不介意每个结果都存在两次,因为插入函数每次都会替换匹配的两者并且封装可以保证这一点(它不暴露指针,只是结构)。
【问题讨论】:
-
另一个想法是使用
std::map<std::set<std::string>, ...>,这样您的密钥将是set(("player1", "player2")),这将是等效的。您还可以创建自己的自定义类,该类实现了已设置语义的operator<,并将其用作键 -
如果比赛只涉及两名玩家,最好使用 std::pair 字符串而不是 std::set。
-
谢谢。我会努力实现的。
-
@AnthonySottile
std::set打乱了球员的顺序,这在这种情况下很重要,因为他们与分数相关。