2016-11-05 2 views
0

Ich versuche, ein Problem im Zusammenhang mit Graphs zu lösen, also habe ich gerade damit begonnen, einen Graph als eine Adjazenzliste darzustellen. Der Code ist unten -Grafik mit STL (Vektor von Listen, d. H. Adjazenzlisten) - 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; 
} 

Dies ist eine seltsame Sache, die ich feststellen, (ich bin kein Experte mit C 11 ++) in Bezug auf die Nutzung (/ deren Fehlen) von „Reserve“. Oder vielleicht ist es die Initialisierung der Liste, mit der ich wirklich falsch liege.

Wenn ich dies tun -

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

Ich kann sehen, dass alle meine Kanten zu den Graph Eckpunkte hinzugefügt werden. Allerdings, wenn ich dies tun -

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

Ich stelle fest, dass der Code erzeugt nur das Diagrammobjekt und bricht, ohne jede Kante hinzufügen. Ich erhalte einen Seg-Fehler, nachdem ich dies auf Mac Bash ausgeführt habe. Hat das etwas mit der Verwendung von "Reserve" zu tun, wo ich nicht berücksichtige, dass der Vektor aus einer Liste besteht?

Was ist der richtige Weg, um diese Adjazenzliste zu initialisieren?

Antwort

2

Sie verwirren Reserve mit Größenanpassung. Reservieren ist eine Art von Optimierung, es macht nur Platz, Elemente in der Zukunft zu schieben, ohne Speicher neu zuweisen zu müssen. Verwenden Sie Ihre erste Implementierung des Graph-Konstruktors oder ändern Sie die Reserve durch Größenanpassung in der zweiten Implementierung