
当我尝试更新一些代码到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> >.总结
以上是内存溢出为你收集整理的c – 为什么不能用std :: unordered_map替换std :: map全部内容,希望文章能够帮你解决c – 为什么不能用std :: unordered_map替换std :: map所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)