0

まず第一に、私はここに似たような投稿がたくさんあることを知っていますが、しばらくの間それらを調べてきましたが、何をする必要があるのか​​ を正確に解読するのに苦労しています. 私の問題については、以前に C で作成した Graph クラスを C++ に変換しています。配列を初期化する方法が原因で、配列をベクトルに変換するのに問題があります。誰かが私を正しい方向に向けることができれば、それは素晴らしいことです. 配列 char* の色をベクトルの色に変換しようとしたのですが、うまくいかず、G++ のエラー メッセージが長く不可解でした。#include ステートメントは省きましたが、それが問題ではないことを約束します。

Graph.h

using namespace std;
const int INF = INT_MAX;  
const int NIL = 0;

class Graph
{
    public:
    Graph(int n);
    Graph(ifstream& in);
    ~Graph(void);

    int getOrder();
    int getSize();
    int getSource();
    int getParent(int u);
    int getDist(int u);
    void getAdjacencyList(List* L, int u);

    void makeNull();
    void addEdge(int u, int v, int weight, int color);
    void addArc(int u, int v, int weight, int color);
    void BFS(int s, int c);
    void Prim(int s, int color);
    void printGraph();
    void printSpanningTree();
    private:
    bool colorApprover(int, bool ,bool , bool);
    void prepGraph(int n);
    int order;
    int size;
    int source;
    vector<char> color (16);
    int* distance;
    int* parent;
    List** edgeDist;
    List** edgeColor;
    List** adj;
};

グラフ.cpp

//helper function to streamline the constructors
void Graph::prepGraph(int n){
    order = n;
    size = 0;
    source = NIL;
    //color (n + 1);//static_cast<char*>(calloc(n + 1, sizeof(char)));
    distance = static_cast<int*>(calloc(n + 1, sizeof(int)));
    parent = static_cast<int*>(calloc(n + 1, sizeof(int)));
    adj = static_cast<List**>(calloc(n + 1, sizeof(List*)));
    edgeDist = static_cast<List**>(calloc(n + 1, sizeof(List*)));
    edgeColor = static_cast<List**>(calloc(n + 1, sizeof(List*)));
    //discover = static_cast<int*>(calloc(n + 1, sizeof(int)));
    //finish = static_cast<int*>(calloc(n + 1, sizeof(int)));
    int i;
    for(i = 0; i <= n; i++){
        color[i] = 'w';
        distance[i] = INF;
        parent[i] = NIL;
        adj[i] = new List();
        edgeDist[i] = new List();
        edgeColor[i] = new List();
    }
}

Graph::Graph(int n){
    prepGraph(n);
}

Graph::Graph(ifstream& in){
int n;
in >> n;
prepGraph(n);
while(!in.eof()){
int i, j, weight, color;
in >> i;
        in >> j;
        in >> weight;
        in >> color;
        //increment values by 1 so they fit
        //into existing graph structure
        i += 1;
        j += 1;
        addEdge(i, j, weight, color);
        //cout << "added arc " << i << " " << j << endl;
    }       
}

コードの残りの部分は配列のランダム アクセス プロパティに依存するため、vector.push_back() だけを実行することはできません。私は C++ に慣れていないので、まだ構文に苦労しています。

編集: これはグラフのエッジリスト形式を使用することに言及する必要があったと思います。リストは私が書いたクラスで、ノードを扱います。C++ ベクトルに変換する必要があるこれらの C 配列をすべて持っているだけで、構文が私を殺しています。たとえば、int* 距離配列は int のベクトルである必要があり、List** edgeDist などは List* のベクトルである必要があります。Graph.cpp 関数 Graph::prepGraph(int n) で初期化するだけで、助けが必要です。構文は少し乱雑ですが、完全に台無しにすることなく、何をしようとしているのかを示そうとしました。言い換えれば、私が苦情を受け続けている static_cast(calloc(whatever)) ステートメントですか? それらを取り除くのを手伝ってください。

4

1 に答える 1

0

コードに多くの問題があります。私はあなたに始めようとします:

//helper function to streamline the constructors
typedef List<int> NodeList;
struct Node {
    char color;
    int distance;
    int parent;
    NodeList adj;
    NodeList edgeDist;
    NodeList edgeColor;

    Node() {
        color = 'w';
        distance = INF;
        parent = 0;
    }
}

class Graph
{ 
...
private:
    vector<Node> nodes;
...
}

void Graph::prepGraph(int n){
    order = n;
    size = 0;
    source = NIL;
    // nodes will be initialized implicitly
}
于 2013-05-23T22:49:30.813 に答える