如何解决'std :: list <int> *'赋值给'std :: list <int> [0]'的不兼容类型?</int> </int>

时间:2013-11-03 05:00:40

标签: c++ c++11

这是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 ++中使用正确的构造函数。

3 个答案:

答案 0 :(得分: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来添加更多元素。

答案 1 :(得分:2)

你的课应该是这样的:         class Graph {         上市:         图(int v = 1):             顶点(v),边(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;
};

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

答案 2 :(得分:1)

除了dasblinkenlight的答案之外:你应该使用std::vector而不是手动分配的数组,如果你可以使用现代编译器支持C ++ 11(在GCC中找到所需的功能&gt; = 4.6, Clang&gt; = 3.0和VC ++&gt; = 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;
    }
}

此外,在这种情况下可能不需要显式存储顶点计数:包含在getter方法中的adj.size()会这样做。