修改unordered_set中的值

Modify value in unordered_set

本文关键字:set unordered 修改      更新时间:2023-10-16

我有以下结构:

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容器一起使用,但是在阅读了另一个数据后,我想修改用户分数 flag等,因此不会影响哈希值,因为我知道所有用户都将事先拥有唯一的名称。

在我的程序中,我使用类似的东西:

unordered_set<User> set;
while(true)
{    
    User user = *set.find({name});
    user.score++;
}

但是,在我的用户对象不范围之后,我发现更多的时间值与修改之前的时间值相同。我如何解决这个问题,也许我应该使用其他容器?我之所以选择这个是因为O(1(复杂性。

unordered_set<>中,每个对象的值是其键。因此,对象无法更改。

您可以解决这个问题的一种方法是使非钥匙成员可变。

也就是,更改

bool flag;
int score;

to

mutable bool flag;
mutable int score;

另外,您正在修改副本。

更改

User user = *set.find({name});

to

auto &user = *set.find({name});

使用映射, unordered_map,其中键是名称,值为用户。