修改unordered_set中的值

时间:2018-02-05 00:35:58

标签: c++

我有以下结构:

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)的复杂性。

2 个答案:

答案 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