1

这是一个简单的 C++ 图形算法

#include <iostream>
#include <string>
#include <list>
#include <vector>

using namespace std;

class Graph {
    public:
        Graph(int v = 1):
            vertexs(v), edges(0) {
                adj = new list<int>[vertexs];
            }

        void test_put() {
            int iter_cnt = 0;
            for (int i = 0; i < vertexs; i++) {
                for (int j = 0; j < 3; j++) {
                    adj[i].push_back(iter_cnt++);
                }
            }
        }

        void test_print() {
            list<int>:: iterator iter;
            for (int i = 0; i < vertexs; i++) {
                for (iter = adj[i].begin(); iter != adj[i].end(); iter++) {
                    cout << *iter << "->";
                }
                cout << "###" << endl;
            }
        }

    private:
        int vertexs;
        int edges;
        list<int> adj[];
};

int main() {
    Graph g(10);
    g.test_put();
    g.test_print();
}

有错误

ian@ubuntu:~/tmp$ g++ wgraph.cpp -o wg
wgraph.cpp: In constructor ‘Graph::Graph(int)’:
wgraph.cpp:12:44: error: incompatible types in assignment of ‘std::list<int>*’ to ‘std::list<int> [0]’

我是一名 java 程序员,我不知道如何在 c++ 中制作正确的构造函数。

4

3 回答 3

3

本声明

list<int> adj[];

生成一个长度为零的数组,而不是稍后可以指定其大小的数组。

虽然你不能直接做你想做的事,但 C++ 标准库提供了一个很好的方法来解决这个问题:使用vector<list<int> >来解决问题。

像这样声明向量:

vector<list<int> > adj;

像这样初始化它:

Graph(int v = 1)
:  vertexs(v), edges(0), adj(vertexs) {
}

其余用法与数组一样 - 您可以使用方括号来访问向量的元素。当然,现在您adj可以根据需要进行扩展 - 您所要做的就是调用push_back添加更多元素。

于 2013-11-03T05:05:04.583 回答
2

你的类应该是这样的: class Graph { public: Graph(int v = 1): vertexs(v), edges(0) { adj = new list[vertexs]; }

    void test_put() {
        int iter_cnt = 0;
        for (int i = 0; i < vertexs; i++) {
            for (int j = 0; j < 3; j++) {
                adj[i].push_back(iter_cnt++);
            }
        }
    }

    void test_print() {
        list<int>:: iterator iter;
        for (int i = 0; i < vertexs; i++) {
            for (iter = adj[i].begin(); iter != adj[i].end(); iter++) {
                cout << *iter << "->";
            }
            cout << "###" << endl;
        }
    }

private:
    int vertexs;
    int edges;
    list<int> *adj;
};

使用列表 *adj; 而不是列表 adj[];

于 2013-11-03T05:13:25.803 回答
1

除了 dasblinkenlight 的回答:您确实应该使用std::vector而不是手动分配的数组,并且如果您可以使用支持 C++11 的现代编译器(在 GCC >= 4.6、Clang >= 3.0 和 VC++ >= 2012 中可以找到所需的功能),您可以以更简洁的方式编写循环:

// member declaration
vector<list<int>> adj;

void test_put() {
    int iter_cnt = 0;
    for (auto &i : adj) {
        for (int j = 0; j < 3; j++) {
            i.push_back(iter_cnt++);
        }
    }
}

// note the const modifier here: if the method does not modify
// object state, it's a good idea to declare it const
void test_print() const {
    for (const auto &i : adj) {
        for (const auto iter : i) {
            cout << iter << "->";
        }
        cout << "###" << endl;
    }
}

此外,在这种情况下,可能不需要显式存储顶点数:adj.size()包装在 getter 方法中就可以了。

于 2013-11-03T05:24:48.400 回答