c – 为什么不能用std :: unordered_map替换std :: map

前端之家收集整理的这篇文章主要介绍了c – 为什么不能用std :: unordered_map替换std :: map前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题可能有点粗略,因为我没有在家里可以使用代码,但是我知道这个东西,否则会在整个周末的时候出现错误.

当我尝试更新一些代码到C 11时,我开始用std :: unordered_map替换一些std :: map.代码只使用std :: map :: find()访问地图中的一个特定元素,所以我认为替换应该很简单.返回的迭代器存储在自动类型变量(auto res = map.find(x))中,所以打字应该检查出来,但是当使用res-> second.do_stuff()访问存储的元素时,我得到一个编译器错误,告诉我,struct std :: pair< char,B>没有成员第二,现在这真的让我感到困惑,但不幸的是我没有时间进一步调查.

也许这是足够的信息,所以有人可以给我一个提示这个奇怪的编译器错误.或者我的理解是,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不起作用任何想法为什么会是这种情况,或者可以做些什么来让它使用std :: unordered_map?

解决方法

我猜这是因为std :: unordered_map需要重新构建,因此复制元素,类型需要完成,而只有使用指向元素的地图才会出现这样的问题.

这里的解决方案是将无序映射映射到指针:

std::unordered_map<uint32_t,std::shared_ptr<Test> >.
原文链接:https://www.f2er.com/c/115436.html

猜你在找的C&C++相关文章