2016-11-05 46 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

您在混淆保留和调整大小。 Reserve是一种优化,它只是在将来不需要重新分配内存时腾出空间来推送元素。 使用Graph构造函数的第一个实现或通过在第二个实现中调整大小来更改预留