making tree with unordered_map

making tree with unordered_map

本文关键字:map unordered with tree making      更新时间:2023-10-16

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