2017-07-30 24 views
-1

ペア(int、int)を要素として持つ2Dベクトルを必要とします。次のコードは実行時に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ベクトル」は単なるベクトルです。ベクトルの使い方を解説し、次に "2次元ベクトル"の使い方を知っています。または "3D"。以上。 – juanchopanza

+2

v(3)が実際に意味するものを見てください。 –

答えて

1

あなたは3の長さとvを初期化するとSIGSEGVが

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

で受信した場合、v[0]は有効な文であると発生しませんので、vは、単に何も含まれていませんセグメンテーション違反。

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)); 

正しく動作するには、以下のように挿入のあなたのコードを変更し:(VCTR)、[挿入:

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); 
    } 

ペアのベクトルを作成し、言うことができます対< i、j> in(vctr)。 を開き、vctrをベクトル(v)に挿入します。