用unordered_map制作树

时间:2014-12-19 10:20:48

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

我想在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}}

2 个答案:

答案 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]的身份访问孩子。