我想在unordered_map
中使用Node类作为值,但是当我尝试编译时,我遇到了与Using unordered_map with custom value object in C++相同的问题
在上述问题的答案中,只提到了如何使用指向Node的指针。
有趣的是map<Key,Node>
编译时没有错误。但是我不想使用map
,因为map
使用时间复杂度为O(log(n))的红黑树,另一方面,unordered_map
似乎需要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
};
恒定时间。
下面是Node类和相关的结构。
{{1}}
答案 0 :(得分:4)
class Node {
public:
unordered_map<unsigned, Bundle> bundle;
unordered_map<unsigned, Node> childs;
此时Node
类型尚未完成,因为您仍在定义它。
使用不完整类型实例化大多数标准库模板(例如unordered_map
)是未定义的行为。 可能可以与某些编译器一起使用,但它可能不会。原因是模板可能需要知道诸如sizeof(Node)
之类的内容以及Node
是否不是可复制构造的,并且它不能知道那些不完整类型的内容。
我猜测你正在使用GCC,它支持std::map
中的不完整类型(作为非标准扩展名)但不支持std::unordered_map
。您可以选择使用其他容器,或使用不同类型的容器(例如unordered_map<unsigned, unique_ptr<Node>>
)
答案 1 :(得分:0)
要添加Jonathan Wakely所说的话,您还可以在std::unique_ptr
本身上使用std::unordered_map
,例如:
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
,因为唯一的指针本身无法清除,更改或无效(也可以是非const的),并且不能确保在对象构造期间创建了它。例如,您将以(*node.childs)[10]
的身份访问孩子。