2010-02-28 87 views
1

我正在嘗試使用C++對網絡建模。我有一個名爲NetworkConnection結構:使用矢量矢量建模網絡

struct NetworkConnection { 
    int i, j, weight; 
} 

,我有一個叫做網絡

class Network { 
    public: 
    std::vector<NetworkConnection> connections_for(int i) { 
     return connections[i]; 
    } 
    void connect(int i, int j, int weight) { 
     NetworkConnection connection; 
     connection.i = i; 
     connection.j = j; 
     connection.weight = weight; 
     connections[i].push_back(connection) 
    } 
    private: 
    std::vector< std::vector<NetworkConnection> > connections; 
} 

類現在我的問題是調用connections_for(我)當我得到段錯誤,特別是在拷貝構造函數。然而令人困惑的是,segfault的確切情況在應用程序的不同運行之間有所不同。我一直在使用指針的向量和指針的載體,像這樣一個向量嘗試:

std::vector< std::vector<NetworkConnection> * > connections; 
std::vector< std::vector<NetworkConnection *> > connections; 

與該接口進行適當的調整,但沒有解決問題。現在我對如何解決這個問題感到不知所措。

我在這裏做錯了什麼?或者,您將如何使用類似於上述的界面在C++中對網絡進行建模?

回答

2

你想使用地圖:

class Network { 
    public: 
    std::vector<NetworkConnection> connections_for(int i) { 
     return connections[i]; 
    } 
    void connect(int i, int j, int weight) { 
     NetworkConnection connection; 
     connection.i = i; 
     connection.j = j; 
     connection.weight = weight; 
     connections[i].push_back(connection); 
    } 
    private: 
    std::map<int, std::vector<NetworkConnection> > connections; 
}; 

你甚至可以使用地圖地圖的:

class Network { 
    public: 
    std::map<int, NetworkConnection> &connections_for(int i) { 
     return connections[i]; 
    } 
    void connect(int i, int j, int weight) { 
     NetworkConnection connection; 
     connection.i = i; 
     connection.j = j; 
     connection.weight = weight; 
     std::map<int, NetworkConnection> &map = connections_for(i); 
     map[j] = connection; 
    } 
    private: 
    std::map<int, std::map<int, NetworkConnection> > connections; 
}; 
+0

我與段錯誤的問題竟然是無關的。然而,我在建模網絡時採取了這種方法。 – derfred 2010-03-05 23:01:22

1

段錯誤問題通常來自不恰當或不初始化矢量。您定義的向量作爲

vector<vector<xxx> > xx; 

可以使用xx.pushback添加新的元素,但是當你用你'xx[i]'需要確保有向量中至少(i+1)元素。最初有0

你需要初始化你的向量的長度。例如

connections.resize(nNodes);