【发布时间】:2012-01-17 03:54:54
【问题描述】:
这个问题可能有点粗略,因为我家里没有可用的代码,但我知道这个问题否则会困扰我整个周末。
当我尝试将一些代码更新为 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除了需要订购的部件外应该有相同的接口,不正确?
编辑:
正如这里所承诺的,对问题进行了更多分析。这很可能会让有人现在更好地帮助我。正如我从 cmets 中的提示猜测的那样,这并不是真正由我访问地图中的元素的点引起的,而是由代码的其他部分引起的。我发现的原因是,我使用 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 有效 std::unordered_map 无效。任何想法为什么会这样,或者可以做些什么来让它与std::unordered_map一起工作?
【问题讨论】:
-
界面大致相同,但您需要确保您的密钥类型是可散列的,而不仅仅是可比较的。
-
@ildjarn:键是示例中给出的简单字符,因此它们应该很容易散列。此外,问题没有出现在
std::unordered_map<char, B> map的定义中或我在其上调用find( x )的位置,而是出现在我尝试访问迭代器(或更准确地说是成员second)的位置。这就是让我感到困惑的部分。 -
你能举出一个最小的例子来说明这个问题吗?
-
你的意思是它不起作用?
std::unordered_map:ideone.com/P2XUastd::map:ideone.com/etuCH -
您的代码在我的 MSVC 2010 上编译得很好。
标签: c++ stl c++11 unordered-map