LiK*_*Kao 10 c++ stl unordered-map c++11
这个问题可能有点粗略,因为我家里没有可用的代码,但是我知道这个东西会在整个周末给我带来麻烦.
当我试图更新一些代码,C++ 11我开始取代一些std::map带std::unordered_map.该代码仅用于std::map::find()访问地图中的特定元素,因此我认为替换应该很容易.返回的迭代器存储在一个auto-typed变量中(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;
}
Run Code Online (Sandbox Code Playgroud)
std::map工作std::unordered_map不起作用.任何想法为什么会这样,或者可以采取什么措施让它与一个std::unordered_map?
sma*_*uck 16
我想这是因为std :: unordered_map需要重新散列,因此复制元素,类型需要完整,而地图,只使用指向元素的指针,不会出现这个问题.
这里的解决方案是为指针提供无序映射:
std::unordered_map<uint32_t, std::shared_ptr<Test> >.
Run Code Online (Sandbox Code Playgroud)
ybu*_*ill 12
使用both map和unordered_map不完整类型涉及undefined-behavior:
特别是,在以下情况下,效果未定义:
[...]
- 如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许该组件.
| 归档时间: |
|
| 查看次数: |
4083 次 |
| 最近记录: |