2017-07-30 98 views
-1

要求帶有一對(int,int)的二維向量作爲元素。下面的代碼給出了SIGSEGV的運行方式。如何解析它?多維向量

int main() 
{ 
vector< vector<pair<int, int> > >v; 
//vector< vector<pair<int, int> > >v(3), problem is resolved, but how ? 


for(int i = 0; i < 3; ++i) 
for(int j = 0; j < 3; ++j) 
    v[i].push_back(make_pair(i, j)); 

for(int i = 0; i < 3; ++i) 
{ 
cout<<"\n"; 
for(int j = 0; j < 3; ++j) 
    cout<<"{"<<v[i][j].first<<", "<<v[i][j].second<<"} "; 
} 

return 0; 
} 
+0

「2D矢量」只是矢量。弄清楚如何使用矢量,然後你就知道如何使用「2D矢量」。或「3D」。或者更多。 – juanchopanza

+2

看看v(3)的實際含義。 –

回答

1

在開始的時候,v僅含有什麼都沒有,所以如果SIGSEGV在

v[0].push_back(make_pair(0, 0)); // First loop 

接收。如果您有長度爲3初始化v,然後v[0]是一個有效的聲明,不會造成分段故障。

如果您沒有初始化v大小,以下代碼應該可以工作。

for(int i = 0; i < 3; ++i){ 
    vector<pair<int,int> > t; 
    for(int j = 0; j < 3; ++j) 
     t.push_back(make_pair(i, j)); 
    v.push_back(std::move(t)); 
} 

由於Zereges代碼改進

+0

'v.push_back(std :: move(t))' – Zereges

+0

@Zereges好吧,複製不會太冗餘,只有3 * 3 = 9的大小。 – iBug

0

你插入錯誤的。

for(int i = 0; i < 3; ++i) 
for(int j = 0; j < 3; ++j) 
    v[i].push_back(make_pair(i, j)); 

更改插入的代碼像下面正常工作:

for(int i = 0; i < 3; ++i) 
    { 
     vector<pair<int, int>> vctr; 
     for(int j = 0; j < 3; ++j) 
     { 
      vctr.push_back(make_pair(i, j)); 
     } 
     v.push_back(vctr); 
    } 

創建對的載體,可以說:(VCTR),然後插入(vctr)中的一對< i,j>。 ,然後將vctr插入向量(v)。