2016-10-31 6 views
-3

私は7 * 3の行列を構築しようとしましたが、値が初期化されているのでその要素を印刷していましたが、残念ながら実行するとプログラムは終了します。同じプロセスをやる方が簡単で効率的な方法があれば教えてください。ベクトルベクトルの個々の要素にアクセスして印刷するにはどうすればよいですか?

vector< vector<int> > v1; 
for(int i = 0;i < 7;i++) 
{ 
    for(int j = 0;j < 3;j++) 
    { 
     v1[i].push_back(i + j); 
     cout << v1[i][j] << " "; 
    } 
    cout << "\n"; 
} 
+0

"終了"
はこれを試してみてください?例外やエラーの場合と同じですか?私たちに表示... – MordechayS

+4

ベクトルは空になり、その中のすべてのインデックスは範囲外です。まず、「ベクトル」を外側のベクトルに押し戻します。 –

+0

@MordechaySそれは問題なくコンパイルされますが、プログラムを実行すると「プロセスが返されました」と表示されます。-1073741819 <0xC0000005> – Jeswin

答えて

3

v1を初期化するのを忘れています。

次を使用することもできます。

std::vector<std::vector<int>> v1(7, std::vector<int>(3)); 
for (int i = 0; i != 7; ++i) { 
    for (int j = 0; j != 3; ++j) { 
     v1[i][j] = i + j; 
    } 
} 

// Display 
for (const auto& row : v1) { 
    for (const auto& e : row) { 
     std::cout << e << " "; 
    } 
    std::cout << "\n"; 
} 
+0

v1を変数で初期化することはできますか? – Jeswin

+0

あなたは何を意味しているのか正確に注意してください。 'v1'を' std :: vector > v1 {{1,2,3}、{4,5,6}、 {7,8,9}、{10,11,12}、{13,14,15}、{16,17,18}、{19,20,21}}; ' – Jarod42

+0

たとえば、次のようにします。int N = 7、x = 3;これでv1をstd :: vector > v1(N、std :: vector (x))として初期化できます。 – Jeswin

0

あなたはv1[x]を使用する前にv1に空vector<int>を配置する必要があります。

vector< vector<int> > v1; 
for(int i = 0;i < 7;i++) 
{ 
    v1.push_back(vector<int>()); 
    for(int j = 0;j < 3;j++) 
    { 
     v1[i].push_back(i + j); 
     cout << v1[i][j] << " "; 
    } 
    cout << "\n"; 
} 

タイプvector< vector<int> > v1;は何とか紛らわしいですが、2つのベクトルが異なる意味を持っています。最初に、v1のタイプを定義することです。この時点でv1は空のベクトルになります。これの代わりに、第2のベクトルは、v1が保持できる型を単に意味します。したがって、これを定義するときにv1は使用する準備ができていますが、v1[x]はまだ作成されていません。

0

はい、あなたのコードは非常に明らかにクラッシュします。

std::vector< std::vector<int> > v1; 
for (int i = 0; i < 7; ++i) 
{ 
    v1.push_back(std::vector<int>()); 
    for (int j = 0; j < 3; ++j) 
    { 
     v1[i].push_back(i + j); 
     std::cout << v1[i][j] << " "; 
    } 
    std::cout << "\n"; 
} 

はEDIT:[OK]を...すでに答え、遅すぎる;-)

+2

まあ...それは彼にとっては明白ではないことは明らかですが、そうでなければ彼はここで尋ねなかったでしょう – bolov

関連する問題