本质上,我想要一个容器,其中一个元素可以通过多个键访问。这可以通过定义一些多键类来用作 map 的键类型来完成,但是由于这样的解决方案不允许修改已经插入的元素的键,所以我无法为现有条目。
我很欣赏 std::map
键需要保持不变以进行排序,但为什么 std::unordered_map
存在此限制?
如果需要,我想我可以只使用指针映射,但是有更好、更优雅的解决方案吗?
编辑:感谢 Andrei,Xeo 解决这个问题。 Nicol,关于我应该使用什么容器有什么建议吗?
最佳答案
嗯,std::unordered_map
不允许您修改 key 的原因与其他关联容器不允许您修改它的原因几乎相同:它会搞砸该数据结构的内部组织。
在 unordered_map
中,键用于获取散列,该散列告诉容器将元素放置在哪个桶中(当然还有从哪个桶中检索元素)。如果修改 key ,则修改散列,这意味着您的元素应该移动到不同的存储桶。基本上,这就像将其移除并再次插入。
另一方面,关联容器的整体思想是任何元素都由一个固定值表示,因此可以根据该值快速计算出它在容器中的位置。如果允许使用多个键,您会使用哪个键来快速确定元素的存储位置或将要存储的位置?
您想要的可能是一个具有不同于标准库的复杂性保证的临时数据结构。
但是,就我个人而言,您似乎只是在寻找引用语义,因为您打算共享一个对象的多个 View 。这自然会引导我使用(智能)指针,尤其是当我听到世界“别名”时。我建议您使用 shared_ptr
作为值的 map 。
关于c++ - 是否可以使用非常量键类型的 unordered_map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14883299/