2010-02-28 76 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);