【问题标题】:nested lists to implement adjacency lists in c++在 C++ 中实现邻接列表的嵌套列表
【发布时间】:2020-09-28 08:13:36
【问题描述】:

我正在查看this website. 上的拓扑排序代码
我理解了代码,除了一部分是邻接表的声明(第 15 行),即

list<int> *adj; 

基本上,对我来说,adj 应该是一个指向整数列表的指针,但在这种情况下,根据他们使用它的方式,它是一个列表列表......所以列表列表不应该是

list <list<int> > adj; 

谁能给我解释一下?

【问题讨论】:

    标签: c++ list pointers stl graph-theory


    【解决方案1】:

    请务必注意,您链接的代码相当单一。它的一个突出问题就是你提到的那个成员list&lt;int&gt; *adj

    在现代 C++ 中,我们倾向于避免使用new and delete directly,而是可以使用智能指针(例如std::unique_ptr)或容器。在这种特定情况下,而不是:

    list<int> *adj;
    // ... etc. ...
    Graph(int V) {
        adj = new std::list<int>[V]; 
    }
    

    使用确实会更好:

    std::vector<std::list<int>> vertex_adjacencies;
    // ... etc. ...
    Graph(std::size_t num_vertices) : vertex_adjacencies(num_vertices) { }
    

    现在,至于您对列表列表的建议 - 这也是可能的:

    std::list<std::list<int>> vertex_adjacencies;
    // ... etc. ...
    Graph(std::size_t num_vertices) : vertex_adjacencies() 
    {
        auto empty_adjacencies = std::list<int>{};
        std::fill_n(
            std::front_inserter(vertex_adjacencies), 
            num_vertices,
            empty_adjacencies);
    }
    

    但这需要重写各种其他方法。另请注意,该图旨在具有固定数量的顶点,而不添加或删除顶点,因此将特定于顶点的邻接放置在列表中没有多大意义。 (并不是说每个顶点的邻接单独的 std::list 是一个好主意,无论如何,性能方面,但不要介意)。

    【讨论】:

      【解决方案2】:

      你也可以这样做,但是这个网站创建的是一个列表数组,而不是一个列表列表。我认为这种方法(列表数组)是在许多编程语言中表示邻接列表的常用方法。 这样顶点的编号从 0 到 V-1,可以直接使用索引运算符 adj[i]

      访问邻接列表

      我真的不知道确切的原因,但我想这是为了提高效率。

      编辑: 请注意,根据 C++ 参考,列表是双链表,因此如果要访问元素 i,则需要通过链接节点进行迭代,直到到达元素 i。使用数组,您可以直接访问您感兴趣的列表,无需迭代,因此效率更高。 在www.cplusplus.com 我们可以阅读:

      与其他序列容器相比,列表和 forward_lists 的主要缺点是它们无法通过位置直接访问元素;例如,要访问列表中的第六个元素,必须从已知位置(如开头或结尾)迭代到该位置,这在它们之间的距离上花费线性时间。它们还消耗一些额外的内存来保持与每个元素相关联的链接信息(这对于小型元素的大型列表可能是一个重要因素)。

      【讨论】:

      • 哦,我明白了。但是由于第一种情况是指向列表数组的指针,那么它不应该是 list[] *adj 吗?
      • 我认为语法比 C++ 更像 Java。无论如何,当我们创建数组时,我们使用指向第一个元素的指针。这是在 C 和 C++ 中完成的方式,实际上默认情况下,当您创建数组时,会分配所需的内存并返回指向第一个元素的指针编辑:实际上,我认为这样您将创建一个指针数组列出,而不是指向列表数组的指针
      猜你喜欢
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2016-10-05
      • 2019-09-07
      相关资源
      最近更新 更多