for循环在c ++中更改数组的值

时间:2018-11-24 15:49:53

标签: c++ arrays for-loop graph

我有一个图形表示,我想创建一个数组以保持度数。

这里有个小测试:

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]++;
}

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 :-)

另一种方法可能是使用指向数组的指针,但这需要分配和释放内存,并且很容易出错。所以最好坚持使用向量。

不相关: 直接访问数组/向量不是一个好的封装。因此,一旦一切正常,请考虑将其私有化,并使用吸气剂访问元素并防止未经授权的更改。