加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:51:22 所属栏目:百科 来源:网络整理
导读:这个问题可能有点粗略,因为我没有在家里可以使用代码,但是我知道这个东西,否则会在整个周末的时候出现错误. 当我尝试更新一些代码到C 11时,我开始用std :: unordered_map替换一些std :: map.代码只使用std :: map :: find()访问地图中的一个特定元素,所以我
这个问题可能有点粗略,因为我没有在家里可以使用代码,但是我知道这个东西,否则会在整个周末的时候出现错误.

当我尝试更新一些代码到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> >.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读