我有一个图形表示,我想创建一个数组以保持度数。
这里有个小测试:
int main()
{
Graph g1(5);
g1.addEdge(1, 1);
g1.addEdge(1, 2);
g1.addEdge(1, 3);
g1.addEdge(2, 3);
g1.addEdge(3, 1);
g1.addEdge(3, 2);
g1.addEdge(3, 5);
g1.addEdge(5, 4);
cout<<g1.array[0]<<endl;
cout<<g1.array[1]<<endl;
cout<<g1.array[2]<<endl;
cout<<g1.array[3]<<endl;
cout<<g1.array[4]<<endl;
for (int i = 0; i < g1.V ; i++) {
cout<<g1.array[i]<<endl;
}
cout<<g1.array[4]<<endl;
return 0;
}
这是我的输出:
values
2
2
2
1
1
entering for loop
2
2
2
1
4 <<< 1 is expected for the last item
loop ended
5 <<< 1 is still expected for last item - but why isn't it 4 anymore?
为什么g1.array[4]
在变化?
看来我数组的最后一个值在for循环中已更改。我找不到错在哪里。
这是我的课程定义:
class Graph
{
//int V; // No. of vertices
list<int> *adj; // A dynamic array of adjacency lists
// A Recursive DFS based function used by SCC()
void SCCUtil(int u, int disc[], int low[],
stack<int> *st, bool stackMember[]);
void topologicalSortUtil(int v, bool visited[], stack<int> &Stack);
public:
int V;
int array [];
Graph(int V); // Constructor
void addEdge(int v, int w); // function to add an edge to graph
void SCC(); // prints strongly connected components
void topologicalSort();
};
Graph::Graph(int V)
{
array[V];
this->V = V;
adj = new list<int>[V];
}
void Graph::addEdge(int v, int w)
{
adj[v-1].push_back(w-1);
array[w-1]++;
}
答案 0 :(得分:1)
问题来自您的阵列。实际上,在C ++中,数组必须具有固定大小,并且它们不会动态增长。因此,您的代码具有未定义的行为。
要解决此问题,请在Graph
中将数组替换为vector:
vector<int> array; //<==== better definition than in array[];
在构造函数中,您可以根据需要调整大小:
array.resize(V); //<===== instead of array[V] which only accesses a non existing element
这是sufficient to make your code work :-)
另一种方法可能是使用指向数组的指针,但这需要分配和释放内存,并且很容易出错。所以最好坚持使用向量。
不相关: 直接访问数组/向量不是一个好的封装。因此,一旦一切正常,请考虑将其私有化,并使用吸气剂访问元素并防止未经授权的更改。