【问题标题】:Declare a C++ std::list with elements that point to other elements in the list用指向列表中其他元素的元素声明一个 C++ std::list
【发布时间】:2021-11-27 09:35:01
【问题描述】:

我正在尝试使用 std::list 和 std::unordered_map 来存储有向无环图。每个列表元素存储一个节点键(无符号)及其子项。并且该映射为每个键存储了一个指向列表中节点的迭代器:

std::list<std::pair<unsigned, std::list<decltype(lst.begin())>>> lst;
std::unordered_map<unsigned, decltype(lst.begin())> nodemap;

但是lst 的声明中的decltype(lst.begin()) 会导致编译错误,因为lst 尚未定义。我可以用另一种方式定义lst 吗?

编辑:使用std::vector&lt;unsigned, std::list&lt;unsigned&gt;&gt; vec 可能会起作用,其中list&lt;unsigned&gt; 包含vec 的索引。不确定坚持最初的std::list 是好是坏。

【问题讨论】:

  • 我最近写了一个答案,其中两个列表的元素相互存储迭代器。我用std::anystackoverflow.com/a/69412271/4117728,虽然可能有更方便的解决方案
  • 我假设您在 std::list&lt;decltype(lst.begin()) 中尝试定义 lst?
  • @doctorlove 是的,我现在刚刚更新了问题以澄清这一点。

标签: c++ templates data-structures graph stl


【解决方案1】:

编写类。在类的定义中,它是一个不完整的类型,这意味着您可以使用指向它的指针(或引用)。

子指针可以是非拥有的,地图拥有所有节点。

class Graph {
    struct Node {
        unsigned key;
        std::vector<Node *> children;
    };

    std::unordered_map<unsigned, Node> nodes;
public:
    // graph behaviours
};

【讨论】:

  • 如果在添加节点时对map进行rehash,Node.children指针将失效。
  • @patraulea 迭代器通过重新散列失效,但指针只有通过擦除该元素才会失效
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多