提问人:Cyrxs 提问时间:4/24/2023 更新时间:4/24/2023 访问量:63
尝试更新自定义字典中特定键的值 (C++)
Trying to update the value of a specific key in a custom dictionary (C++)
问:
所以我正在尝试浏览我的字典,它由列表桶 (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;
}
答:
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
感谢您的帮助!是的,我想我对正在发生的事情感到困惑。
评论
if
std::unordered_map<Key, Value>
mySet[key] = newValue;