2016-06-14 85 views
1
#include <iostream> 
#include <vector> 

using namespace std; 

struct Neighbor 
{ 
    int index; 
    int weight; 
    Neighbor(int, int); 
}; 

Neighbor::Neighbor(int index, int weight) 
{ 
    Neighbor::index = index; 
    Neighbor::weight = weight; 
} 

void addEdge(vector<vector<Neighbor> > &graph, int v1, int v2, int weight) 
{ 
    graph[v1].push_back(Neighbor(v2, weight)); 
    graph[v2].push_back(Neighbor(v1, weight)); 
} 

int main() 
{ 
    vector<vector<Neighbor> > graph; 
    vector<vector<Neighbor> > graphIterator; 
    graph[0].push_back(Neighbor(1, 5)); 
    graph[0].push_back(Neighbor(3, 3)); 
    graph[0].push_back(Neighbor(4, 2.5)); 

    graph[1].push_back(Neighbor(0, 5)); 
    graph[1].push_back(Neighbor(2, 3)); 

    graph[2].push_back(Neighbor(1, 3)); 
    graph[2].push_back(Neighbor(4, 2.5)); 
    graph[2].push_back(Neighbor(3, 5)); 

    graph[3].push_back(Neighbor(0, 3)); 
    graph[3].push_back(Neighbor(2, 5)); 
    graph[3].push_back(Neighbor(4, 2.5)); 

    graph[4].push_back(Neighbor(0, 2.5)); 
    graph[4].push_back(Neighbor(2, 2.5)); 
    graph[4].push_back(Neighbor(3, 2.5)); 

    return 0; 
} 

上面是我的代码,运行时似乎崩溃了。尽管声明向量图似乎工作正常,但即使包含我的第一个push_back语句,程序也会崩溃。有人可以提醒我吗?C++崩溃:嵌套向量上的push_back

回答

4

graph[0].push_back(Neighbor(1, 5));,仍为空时,它没有元素,并且graph[0]通向UB。

您应该添加的元素首先,如:

graph.push_back(vector<Neighbor>()); // add one element 
... 

vector<vector<Neighbor> > graph(5); // construct vector with 5 elements 

vector<vector<Neighbor> > graph; 
graph.resize(5);     // resize vector to contain 5 elements. 
+0

谢谢。你的第二个解决方案完美运作 –

0

创建空的,那么您尝试访问graph[0],... graph[4]这不在那里。

您最初可以声明它为vector<vector<Neighbor> > graph(5);,以便它初始化为包含5个空向量Neighbor s。

1

这里

vector<vector<Neighbor> > graph; 
/*...*/ 
graph[0].push_back(Neighbor(1, 5)); 

您正在访问到graph[0]至极尚未创建。如果您创建一个typedefvector<Neighbor>,这是最好的可视化。

typedef vector<Neighbor> NeighborVec; 
vector<NeighborVec> graph; 
NeighborVec& firstVec = graph[0]; 

你可以清楚地看到,虽然已初始化graph[0]没有。你需要做的:

typedef vector<Neighbor> NeighborVec; 
vector<NeighborVec> graph; 
graph.push_back(NeighborVec()); 
NeighborVec& firstVec = graph[0]; 
firstVec.push_back(Neighbor(1, 5)); 

TL;博士:

你忘了初始化向量嵌套的第一级。

+0

注意'firstVec'从'graph [0]'复制而来,然后'firstVec.push_back(..)'与'graph [0]'(和'graph')无关。 – songyuanyao

+0

你说得对,只是编辑了我的答案。 –