2016-06-14 41 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

你說得對,只是編輯了我的答案。 –