making tree with unordered_map
making tree with unordered_map
我想在unordered_map
中使用 Node 类作为值,但是当我尝试编译时,我遇到了与在自定义值对象中使用 unordered_map 相同的问题C++在上述问题的答案中,只提到了如何使用指向 Node 的指针。
有趣的是,map<Key,Node>
编译没有错误。但我不想使用map
因为map
使用时间复杂度为 O(log(n((的红黑树,另一方面,unordered_map
似乎需要恒定的时间。
下面是 Node 类和相关结构。
struct Bundle{
double prob;
vector<int> type;
};
typedef struct Bundle Bundle;
class Node {
public:
unordered_map<unsigned, Bundle> bundle;
unordered_map<unsigned, Node> childs;
private:
//private method here
};
class Node {
public:
unordered_map<unsigned, Bundle> bundle;
unordered_map<unsigned, Node> childs;
此时,Node
类型尚未完成,因为您仍在定义它。
实例化大多数具有不完整类型的标准库模板(如 unordered_map
(是未定义的行为。它可能适用于某些编译器,但可能不适用于。原因是模板可能需要知道诸如sizeof(Node)
之类的东西,以及Node
是否是nothrow-copy-constructable,并且对于不完整的类型,它无法知道这些事情。
我猜你使用的是 GCC,它支持std::map
中的不完整类型(作为非标准扩展(,但不支持std::unordered_map
.您的选择是使用不同的容器,或使用不同类型的容器(例如 unordered_map<unsigned, unique_ptr<Node>>
(
为了补充Jonathan Wakely所说的话,您还可以对std::unordered_map
本身使用std::unique_ptr
,如下所示:
class Node {
public:
unordered_map<unsigned, Bundle> bundle;
const unique_ptr<unordered_map<unsigned, Node>> childs;
Node() : childs(make_unique<unordered_map<unsigned, Node>>) { }
这被标记为const
因为唯一指针本身无法清除、更改或失效(也可能是非常量(,并确保它是在对象构造期间创建的。例如,您可以访问孩子作为(*node.childs)[10]
。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- unordered map -在c++ std::unordered_map中预分配桶