这是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 ++中使用正确的构造函数。
答案 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()
会这样做。