c++ - 用 unordered_map 制作树

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

我想使用 Node 类作为 unordered_map 中的值,但是当我尝试编译时,我遇到了与Using unordered_map with custom value object in 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不可抛出复制构造,并且对于不完整的类型,它无法知道这些事情。

我猜您正在使用 GCC,它支持 std::map 中的不完整类型(作为非标准扩展名)但不是 std::unordered_map .您的选择是使用不同的容器,或使用不同类型的容器(例如 unordered_map<unsigned, unique_ptr<Node>> )

关于c++ - 用 unordered_map 制作树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27563931/

相关文章:

c++ - 在返回值上调用 std::move - 签名应该是什么

c++ - 如何在派生类数据中使用基类进行比较

c++ - 在 unordered_map 中放置一个结构,引用问题

c++ - C++ 中的 vector 到字符串和 HashMap

C++ 如何将此数组类型复制到 Vector

c++ - 有没有办法让构造函数接受两种可能的参数类型?

c++ - 在 C++11 中使用右值引用

c++ - 在 C++ 中的无序映射中访问列表的元素

c++ - OpenCV矩阵乘法断言

c++ - 这似乎是 clang++ 编译器中的一个错误