为什么我不能将 std::map 替换为 std::unordered_map
Why can't I replace std::map with std::unordered_map
这个问题可能有点粗略,因为我家里没有可用的代码,但我知道这件事会困扰我整个周末。
当我尝试将一些代码更新到c++ 11时,我开始用std::unordered_map
替换一些std::map
。代码只使用std::map::find()
来访问地图中的特定元素,所以我认为替换应该很容易。返回的迭代器存储在auto
类型的变量(auto res = map.find( x )
)中,因此类型应该检查得很好。然而,当使用res->second.do_stuff()
访问存储的元素时,我得到了一个编译器错误,告诉我,struct std::pair<char, B> does not have a member second
。现在我真的很困惑,但不幸的是,我没有时间进一步调查。
也许这是足够的信息,所以有人可以给我提示这个奇怪的编译错误。还是我的理解是std::map
和std::unordered_map
除了需要排序的部分应该是一样的接口,不正确?
编辑:
如前所述,这里对问题进行了更多的分析。这很可能会让别人更好地帮助我。正如我从注释中的提示中猜测的那样,这实际上不是由我访问映射中的元素的点引起的,而是由代码的其他部分引起的。我发现原因是,我使用类X中的映射来存储指向类X的其他元素的指针(一种树结构)。然而,这似乎适用于std::map
,但不适用于std::unordered_map
。下面是显示这个问题的一些非常简单的代码:
#include <stdint.h>
#include <unordered_map>
#include <map>
class Test {
std::map<uint32_t, Test> m_map1; // Works
std::unordered_map<uint32_t, Test> m_map; // gives error: ‘std::pair<_T1, _T2>::second’ has incomplete type
};
int main() {
return 1;
}
std::map
works std::unordered_map
not work。
std::unordered_map
一起工作?我猜,因为std::unordered_map需要重新散列,因此需要复制元素,所以类型需要是完整的,而map只使用指向元素的指针,不会出现这个问题。
这里的解决方案是使用一个指向指针的无序映射:
std::unordered_map<uint32_t, std::shared_ptr<Test> >.
使用不完全类型的map
和unordered_map
涉及未定义行为:
在以下情况下,效果是未定义的:
[…]
-如果在实例化模板组件时使用不完整类型(3.9)作为模板参数,除非该组件特别允许。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 使用一个考虑到std::map中键值的滚动或换行的键
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- C++如何创建 std::map
- 从其他容器中移动构造"std::map"
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 使用重载 [] 运算符返回 std::map() 的可赋值
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- C++ 使用枚举类对象分配 std::map 值
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- std::map:当元素不可默认构造时创建/替换元素
- Arduino编译器和STL:使用std::vector和std::map