在无序多图中更改密钥

时间:2014-06-22 13:48:13

标签: c++ c++11 multimap

是否有一些有效的方法来更改无序多重映射中的键?例如,我想将密钥从key_val1更改为key_val2。看起来这可以比迭代equal_range(...)并读取新密钥的所有对并随后删除旧密钥更有效地完成。

1 个答案:

答案 0 :(得分:3)

<击>否。如果您想更改密钥,除了删除现有项目,使用新密钥创建新项目,并将新项目插入集合外,别无选择。

unordered_multi(set|map)(至少通常)实现为哈希表。密钥的任何更改都需要计算新密钥的哈希值(可能完全与旧密钥的哈希值不同,即使密钥只是稍作修改)。

考虑事情,如果你有足够的雄心,你可能可以实际做到这一点。我不确定它是否值得,但它可能是可能的。特别是,无序关联容器支持所谓的local iterators。本地迭代器可以遍历表中特定存储桶中的项。根据定义,所有具有相同键的项目必须位于同一个桶中。

因此,您首先要获取包含项目的存储桶的本地迭代器。然后,您将使用key_equal进行迭代,以查找包含相同键的所有项目。然后你将使用hasher为所有这些找到新的存储桶,并直接将它们全部移动到新的存储桶中。

我从来没有真正做到这一点,所以我不是某些 local_iterator为您提供了足够的访问权限 - 但它看起来似乎至少可能有可能 - 无论如何都可能值得进一步调查。

我自己对事情的看法是,如果你经常这样做可能足以打扰优化任务,那么考虑使用unordered_map<key, std::vector<whatever>>可能是值得考虑的,所以你只有一个存储密钥,与任意数量的项目相关联。然后,如果你需要修改那个密钥,用它移动所有相关数据是微不足道的(几乎是自动发生)。