标准是否要求 std::unordered_map 将键值对放在内存中?

Does the standard mandate that std::unordered_map place key value pairs together in memory?

C++ 标准是否强制要求 std::unordered_map 的一致实现将每个键和值一起放在内存中?

我认为答案是肯定的,因为 std::unordered_map 的大部分内容都是根据 std::pair 指定的,而且我认为隐藏不相交的键值对细节的操作是不必要的内存可以完全隐藏,但我不确定。

要求映射迭代器指向 std::pair<const Key, T> 并且要求迭代器引用的对象不会随时间改变其地址,因此无法以其他方式实现。所述对应该存在并且是持久的。

可能 map 可以保存两个 key-value 对以供说明并维护密钥的内部副本以供搜索,但它在 space 和性能方面都是低效的。

标准要求 std::map::iteratorvalue_typestd::pair<const key, T>,因此(例如)当您使用迭代器遍历地图时,每次取消引用迭代器时,你得到一个 pair<const key, T>.

该标准还要求(例如)emplace return 是一个迭代器 "to the newly inserted element"。至少根据我的阅读,这意味着你不能让它彼此分开存储键和值,而只是(例如)将 key/value 复制到一个临时位置,这样它就可以 return a pointer/reference 按需到那个位置。

后者会(例如)违反异常安全要求。它必须进行复制才能使集合中的元素可见,在不允许这样做的情况下,因为这样的复制可能会引发异常,但所讨论的函数不允许这样做(实际上,可以放置类型根本无法复制)。