是否有一些有效的方法来更改无序多重映射中的键?例如,我想将密钥从key_val1
更改为key_val2
。看起来这可以比迭代equal_range(...)
并读取新密钥的所有对并随后删除旧密钥更有效地完成。
答案 0 :(得分:3)
<击>否。如果您想更改密钥,除了删除现有项目,使用新密钥创建新项目,并将新项目插入集合外,别无选择。
unordered_multi(set|map)
(至少通常)实现为哈希表。密钥的任何更改都需要计算新密钥的哈希值(可能完全与旧密钥的哈希值不同,即使密钥只是稍作修改)。
考虑事情,如果你有足够的雄心,你可能可以实际做到这一点。我不确定它是否值得,但它可能是可能的。特别是,无序关联容器支持所谓的local iterators
。本地迭代器可以遍历表中特定存储桶中的项。根据定义,所有具有相同键的项目必须位于同一个桶中。
因此,您首先要获取包含项目的存储桶的本地迭代器。然后,您将使用key_equal
进行迭代,以查找包含相同键的所有项目。然后你将使用hasher为所有这些找到新的存储桶,并直接将它们全部移动到新的存储桶中。
我从来没有真正做到这一点,所以我不是某些 local_iterator为您提供了足够的访问权限 - 但它看起来似乎至少可能有可能 - 无论如何都可能值得进一步调查。
我自己对事情的看法是,如果你经常这样做可能足以打扰优化任务,那么考虑使用unordered_map<key, std::vector<whatever>>
可能是值得考虑的,所以你只有一个存储密钥,与任意数量的项目相关联。然后,如果你需要修改那个密钥,用它移动所有相关数据是微不足道的(几乎是自动发生)。