我有以下结构:
struct User
{
string name;
bool flag;
int score;
bool operator==(const User& user) const
{
return name == user.name;
}
}
namespace std {
template<>
struct hash<User>
{
size_t operator()(const User& user) const
{
return hash<string>{}(user.m_nickname);
}
};
}
之后我想使用带有unordered_set容器的User,但是在读取了另一部分数据之后我想修改用户得分\标志等,因此它不会影响哈希值,因为我知道所有用户都会预先拥有唯一的名称。
在我的程序中,我使用类似的东西:
unordered_set<User> set;
while(true)
{
User user = *set.find({name});
user.score++;
}
但是在我的用户对象超出范围之后,我再次发现它的值仍然与修改前的值相同。我怎么能解决这个问题,也许我应该使用其他容器?我选择了这个因为O(1)的复杂性。
答案 0 :(得分:3)
使用Map unordered_map
,其中键是名称,值为User。
答案 1 :(得分:1)
在bool flag;
int score;
中,每个对象的值都是它的关键。因此,对象无法改变。
解决这个问题的一种方法是让非关键成员变得可变。
即改变
mutable bool flag;
mutable int score;
到
User user = *set.find({name});
此外,您正在修改副本。
更改
auto &user = *set.find({name});
到
NumberFormat