c++ - 为什么我不能用 std::unordered_map 替换 std::map

标签 c++ stl c++11 unordered-map

这个问题可能有点粗略,因为我家里没有可用的代码,但我知道这个问题会困扰我整个周末。

当我尝试将一些代码更新到 C++11 时,我开始替换一些 std::mapstd::unordered_map .代码只用了std::map::find()访问 map 中的特定元素,所以我认为替换应该很容易。返回的迭代器存储在 auto 中-typed 变量( auto res = map.find( x ) ,所以输入应该检查正常。但是当使用 res->second.do_stuff() 访问存储的元素时,我得到一个编译器错误,告诉我 struct std::pair<char, B> does not have a member second 。现在这真的让我感到困惑,但不幸的是我做到了没有时间进一步调查。

也许这些信息就足够了,所以有人可以给我一些关于这个奇怪的编译器错误的提示。或者我的理解是 std::mapstd::unordered_map除了需要排序的部分外应该有相同的接口(interface),不正确?

编辑:

正如这里所 promise 的,对问题进行更多分析。这很可能会让某人现在更好地帮助我。正如我从评论中的提示中猜测的那样,这并不是真正由我访问 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作品 std::unordered_map不起作用。任何想法为什么会这样,或者可以做些什么来让它与 std::unordered_map 一起工作?

最佳答案

我猜是因为 std::unordered_map 需要重新散列,因此需要复制元素,所以类型需要完整,而映射,只使用指向元素的指针,不会出现这个问题。

这里的解决方案是有一个指向指针的无序映射:

std::unordered_map<uint32_t, std::shared_ptr<Test> >. 

关于c++ - 为什么我不能用 std::unordered_map 替换 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452566/

相关文章:

c++ - 找不到模式时如何打印 "no mode"?

c++ - 我需要在 C++ 中销毁一个字符串吗

c++ - 如何在 C++ 中创建哈希表?

从 std::exception 派生的 C++ 自定义异常未被捕获

c++ - 我可以编写自定义分配器来决定 std::vector 的重新分配量吗?

C++:string = NULL 给出 SEGFAULT 11?

c++ - 用于实时编程的低级 C/C++ 网络概念?

c++ - 在模板类中定义迭代器时出现 STL 编译错误

c++ - 左值的正确引用

c++ - 由空指针常量 : which behaviour is correct? 初始化