2013-11-03 39 views
1

这是C++中的简单的图形算法如何解决'std :: list <int> *'赋值为'std :: list <int> [0]'的不兼容类型?

#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(); 
} 

有一个错误

[email protected]:~/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

此声明

list<int> adj[]; 

产生一个零长度数组,而不是一个数组,其大小可以在以后详细说明。

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

声明向量是这样的:

vector<list<int> > adj; 

初始化这样的:

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

使用的其余部分保持不变,就好像它是一个数组 - 您可以使用方括号来访问矢量的元素。当然现在您的adj可以根据需要进行扩展 - 您只需拨打push_back即可添加更多元素。

2

你的类应该是这样的: 类格拉夫{ 公共: 格拉夫(INT V = 1): vertexs(V),边缘(0){ ADJ =新的列表[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 [];

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方法会做。

相关问题