c++ - 是否可以使用非常量键类型的 unordered_map?

标签 c++ stl c++11 unordered-map stdmap

本质上,我想要一个容器,其中一个元素可以通过多个键访问。这可以通过定义一些多键类来用作 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/

相关文章:

c# - OpenGL/DirectX Hook - 类似于 FRAPS

c++ - 对范围项使用 std::set 容器

c++ - 奇怪的模板模板参数预期错误

c++ - 通用/模板编程最佳实践 : To limit types, 或不限制类型

c++ - Qt - 无法让 lambda 工作

c++ - QGraphicsView 不显示在 mainWindow 中

c++ - Makefile 操作系统检测和 ifeq 未被触发

c++ - 即使在数组上执行了上限,也超过了时间限制

C++ 从 map 的第二个元素迭代

c++ - 输出迭代器的 value_type