假设我们要为Graph创建一个类。该类存储图的邻接矩阵表示。因此, 我们的类结构如下所示。
class Graph
{
int V;
int adj[V][V];
//This line doesn't work/* Rest of the members */
};
int main()
{
}
【如何在C++中的类内创建动态2D数组()】输出:
error: invalid use of non-static datamember 'Graph::V'.
即使我们将V设为静态, 也会出现错误"数组边界不是整数常量"
C ++不允许在大小不恒定的类中创建堆栈分配的数组。因此, 我们需要动态分配内存。下面是一个简单的程序, 用于显示如何使用带有邻接矩阵表示形式的Graph类在C ++类中动态分配2D数组。
//C++ program to show how to allocate dynamic 2D
//array in a class using a Graph example.
#include<
bits/stdc++.h>
using namespace std;
//A Class to represent directed graph
class Graph
{
int V;
//No. of vertices//adj[u][v] would be true if there is an edge
//from u to v, else false
bool **adj;
public :
Graph( int V);
//Constructor//function to add an edge to graph
void addEdge( int u, int v){ adj[u][v] = true ;
}
void print();
};
Graph::Graph( int V)
{
this ->
V = V;
//Create a dynamic array of pointers
adj = new bool * [V];
//Create a row for every pointer
for ( int i=0;
i<
V;
i++)
{
//Note : Rows may not be contiguous
adj[i] = new bool [V];
//Initialize all entries as false to indicate
//that there are no edges initially
memset (adj[i], false , V* sizeof ( bool ));
}
}//Utility method to print adjacency matrix
void Graph::print()
{
for ( int u=0;
u<
V;
u++)
{
for ( int v=0;
v<
V;
v++)
cout <
<
adj[u][v] <
<
" " ;
cout <
<
endl;
}
}//Driver method
int main()
{
//Create a graph given in the above diagram
Graph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
g.print();
return 0;
}
输出:
0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 1
关于调用memset()的注释:
memset()用于单独的行。我们无法将这些调用替换为一个调用, 因为行被分配到了不同的地址, 并且进行如下所示的memset调用将是灾难性的。
//Wrong!! (Rows of matrix at different addresses)memset(adj, false, V*V*sizeof(bool));
本文作者:德莱拉吉·古普塔(Dheeraj Gupta)。如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。
推荐阅读
- 带头和尾指针的双链表中的排序插入
- 使用Python-Tkinter创建第一个GUI应用程序
- 如何在Java中创建不可变类()
- 在二叉树中创建偶数值和奇数值的循环
- 如何创建可合并栈()
- 如何为网站创建响应式模式注册表单()
- 使用python创建秒表
- 笔记本独显并非都是“高性能”!
- 详解手机无线充电技术的黑历史