【问题标题】:square brackets [] when using pointer to list in c++在 C++ 中使用指向列表的指针时的方括号 []
【发布时间】:2020-10-03 19:55:34
【问题描述】:

我正在查看这段代码以在 C++ 中实现 Dijkstra 的最短路径算法: https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-using-priority_queue-stl/?ref=lbp

此时的代码我很困惑:

Graph::Graph(int V) 
{ 
    this->V = V; 
    adj = new list<iPair> [V]; 
} 
  
void Graph::addEdge(int u, int v, int w) 
{ 
    adj[u].push_back(make_pair(v, w)); 
    adj[v].push_back(make_pair(u, w)); 
} 

adj 是一个指向包含两个整数对的列表的指针。

list< pair<int, int> > *adj;

然后他们在 adj 列表中使用方括号 []。我认为无法通过索引访问列表。我试过到处找这个,找不到任何东西。该网站本身也没有响应。有人知道这段代码在做什么吗?

【问题讨论】:

  • operator newoperator new[] 之间存在差异。前者创建一个对象,后者创建一个array对象。
  • 所以他们实际上是在创建一个列表数组,然后通过索引访问该数组?
  • 如果您显示的代码是他们使用的,那么,是的,他们正在创建一个列表数组,其中(在您的代码中)adj 是一个包含 V 对象的数组987654328@ 类型。
  • @KyleJones “所以他们实际上是在创建一个列表数组,然后通过索引访问该数组?” 是的。更好的选择是使用std::vector&lt;std::list&lt;iPair&gt; adj(N)
  • @KyleJones 每个 V 节点可以与可变数量的其他节点相邻,并且存储在列表中。因此 V 列表的数组。 adj[n] 可能表示“与节点 n 相邻的节点列表”。

标签: c++ list indexing


【解决方案1】:

在代码中,adj 是一个列表数组(V 长度数组)。

adj = new list<iPair> [V]; 

因此可以接受括号来访问该数组的元素。

【讨论】:

    【解决方案2】:

    首先,这段代码质量不好:永远不要在应用程序代码中直接使用new,容器和智能指针就足够了。

    但是,代码是有效的。 adj 不是指向一个列表的指针。注意Graph 构造函数中new 行末尾的方括号。它分配V 列表。然后您可以将这些列表称为adj[0] ... adj[V-1]

    【讨论】:

      【解决方案3】:

      然后他们在 adj 列表中使用方括号 []

      你忘了展示他们做了什么,但我敢打赌他们不会按照你说的去做。

      我敢打赌,他们在指向列表的指针上而不是在指向的列表上使用下标运算符。这是允许的,因为列表是列表数组中的一个元素。

      附:如果他们使用拥有裸指针,这不是一个非常高质量的教程。对他们的代码持保留态度。

      【讨论】:

        猜你喜欢
        • 2012-06-19
        • 2012-09-11
        • 2018-04-22
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 2019-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多