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

时间:2016-01-18 22:36:33

标签: c++ c++11 language-lawyer unordered-map

C ++标准是否有效地要求std::unordered_map的符合实现将每个键和值放在内存中?

我认为答案是肯定的,因为std::unordered_map的大部分内容是根据std::pair指定的,我不认为隐藏不相交的键值对的详细信息所需的操作记忆可以完全隐藏,但我不确定。

2 个答案:

答案 0 :(得分:8)

标准要求std::map::iterator的{​​{1}}为std::pair<const key, T>,所以(例如)当你使用迭代器遍历地图时,每次取消引用迭代器时,你得到pair<const key, T>

该标准还要求(例如)emplace向新插入的元素&#34;返回迭代器&#34;。至少通过我的阅读,这意味着你不能将密钥和值彼此分开存储,只是(例如)将一个键/值复制到一个临时位置,这样它就可以返回一个指针/引用按需到那个地方。

后者会(例如)违反异常安全要求。它必须进行复制才能使集合中的元素可见,如果不允许这样做,因为这样的复制可能会抛出异常,但是这个函数不允许这样做(实际上是这样的) ,它可以设置无法复制的类型。

答案 1 :(得分:2)

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

潜在地图可以保存两个键值对以进行展示,并维护按键的内部副本以供搜索,但它对于空间和性能都是无效的。