【问题标题】:making tree with unordered_map用 unordered_map 制作树
【发布时间】:2014-12-19 10:20:47
【问题描述】:

我想在unordered_map中使用Node类作为值,但是当我尝试编译时,我遇到了与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
};

【问题讨论】:

  • Node是什么类型的?
  • 抱歉,我应该更详细地说明问题。我会尽快编辑。
  • 我对您的问题的第一个猜测是无法复制节点。 unordered_map 被实现为哈希表,但有时哈希表会调整大小,并且元素需要重新哈希并复制/移动到它们的新位置。如果节点无法复制或移动,则不能将其用作 unordered_map 中的值类型。如果需要,您可以改用 Node* 或 unique_ptr
  • @Charlie 我明白了。如果我使用 Node* 或 unique_ptr,我想我必须手动清除所有子节点,而 map 不需要我这样做。
  • @HitoshiOtsuki,不,如果您使用unique_ptr&lt;Node&gt;,您确实不需要需要手动执行任何操作,unique_ptr 析构函数将运行 Node 析构函数

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


【解决方案1】:
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&lt;unsigned, unique_ptr&lt;Node&gt;&gt;

【讨论】:

    【解决方案2】:

    要补充 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,因此唯一指针本身不能被清除、更改或无效(也可以是非常量),并确保它是在对象构造期间创建的。例如,您可以使用(*node.childs)[10] 访问子级。

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 2020-12-27
      • 2016-09-10
      相关资源
      最近更新 更多