尝试更新自定义字典中特定键的值 (C++)

Trying to update the value of a specific key in a custom dictionary (C++)

提问人:Cyrxs 提问时间:4/24/2023 更新时间:4/24/2023 访问量:63

问:

所以我正在尝试浏览我的字典,它由列表桶 (mTable) 组成,这些列表由对(键键、值值)组成。该函数被赋予一个 const Key&,该键经过哈希处理,用于在指定的存储桶中查找。它还被赋予一个常量 Value&。

如果未找到密钥,则给定的 Key& 和 Value& 将配对在一起,并添加到指定存储桶的列表中。

但是,找到密钥后,只需将当前值更新为传递给函数的值即可。

两个条件分别按预期工作。但是,一旦两个条件并存,检查键是否已存在于存储桶中的条件将尝试添加新对,就好像该键不存在一样。

void Insert(const Key& _key, const Value& _value) {
        
    int bucket = mHashFunc(_key);   
    for (auto _listIter = mTable[bucket].begin(); _listIter != mTable[bucket].end(); ++_listIter) {
            if (_listIter->key != _key) {
                mTable[bucket].push_back(Pair(_key, _value));
                break;
                
            }
            else if(_listIter->key == _key)
                _listIter->value = _value;
}
C++ 列表 Visual-Studio 字典 哈希表

评论

1赞 user17732522 4/24/2023
如果地图中的任何键与您的新键不匹配,则添加该对,如果地图有两个或更多元素具有不同的键,则总是如此。通过纸上或调试器中的示例来了解循环和构造的逻辑,您将了解原因。if
0赞 Jerry Coffin 4/24/2023
鉴于您所描述的内容,显而易见的实现是使用一个 在这种情况下,添加/更新值将写为std::unordered_map<Key, Value>mySet[key] = newValue;

答:

1赞 Wil Gaboury 4/24/2023 #1

代码的逻辑与所描述的过程不一致。如果第一个元素与要插入的元素没有相同的键,则您的代码将插入一个新元素对并返回,即使存储桶列表中还有一对具有相同键的元素也是如此。请尝试以下操作。

void Insert(const Key& _key, const Value& _value) {
    int bucket = mHashFunc(_key);
    for (auto _listIter = mTable[bucket].begin(); _listIter != mTable[bucket].end(); _listIter++) {
        if(_listIter->key == _key) {
            _listIter->value = _value;
            return;
        }
    }
    mTable[bucket].push_back(Pair(_key, _value));
}

顺便说一句,在参数名称和局部变量的开头放置下划线是一种相当奇怪的做法。遵循流行的准则和样式很重要,因为它使你的代码对其他人来说更具可读性,因此我建议仔细阅读以下文档:https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md

评论

0赞 Cyrxs 4/24/2023
感谢您的帮助!是的,我想我对正在发生的事情感到困惑。