2016-11-05 6 views
0

Graphsに関連する問題を解決しようとしていますので、グラフを隣接リストとして表現し始めました。コードは以下の通りです - 。ここでSTL(リストのベクトル、隣接リスト)のベクトル - C++

#include <iostream> 
#include <list> 
#include <vector> 
#include <queue> 
#include <stack> 

using namespace std; 

class Graph 
{ 

    private: 
     vector<list<int> > aList; 
    public: 
     Graph(int nodenum=10):aList(nodenum) 
     { 
      cout << "Created an adjacency list with "<< nodenum<< " nodes" << endl; 
     } 

     void addEdge(int from, int to) 
     { 
      aList[from].push_back(to); 
      cout << "Executed" << endl; 
     } 

     int size() 
     { 
      return aList.size(); 
     } 

}; 


int main() { 

    Graph gObj(4); // Graph's size is 4 nodes. 
    gObj.addEdge(0,1); 
    gObj.addEdge(1,2); 
    gObj.addEdge(2,0); 
    gObj.addEdge(3,2); 

    cout << "Destroyed" << endl; 

    return 0; 
} 

は、私が「予備」の使い方(/その欠如)に関して、(私はC++ 11との専門家ではないよ)気付か好奇心旺盛なことですそれとも、私が本当に間違っているリストの初期化です。

私はこれを行う場合 -

Graph(int nodenum=10):aList(nodenum) 
{ 
     cout << "Created an adjacency list with "<< nodenum<< " nodes" << endl; 
} 

私はすべてのエッジがグラフの頂点に追加されていることがわかります。私がしなければ しかし、これは -

Graph(int nodenum=10) 
{ 
     aList.reserve(nodenum); 
     cout << "Created an adjacency list with "<< nodenum<< " nodes" << endl; 
} 

私はコードだけで任意のエッジを追加することなく、グラフオブジェクトや休憩を作成することに注意してください。私はこれをMac Bashで実行した後にSegフォルトを取得します。これは、ベクトルが内部のリストで構成されていることを考慮していない「予備」の使用と関係がありますか?

この隣接リストを初期化する正しい方法は何ですか?

答えて

2

リザーブをresizeと混同しています。リザーブは最適化の一種であり、メモリを再割り当てすることなく将来要素をプッシュする余地があります。 グラフのコンストラクタの最初の実装を使用するか、2番目の実装でサイズを変更して予備を変更してください

関連する問題