2016-04-22 13 views
0

2次元ベクトルで2D行列を入力したいと思っています。しかし、私が下のようにしている間、プログラムはクラッシュした!!!しかし、なぜ?C++での2Dベクトルの初期化

int m, n; 
cin>>m>>n; 

vector<vector<int> > v; 

for(int i=0; i<m; i++) 
{ 
    for(int j=0; j<n; j++) 
    { 
     int a; 
     cin>>a; 
     v[i].push_back(a); 
    } 
} 

私のコードに従った解決策は何でしょうか。

v[i].push_back(a);

答えて

5

forループ内で呼び出される時点で、ベクターvは空であり、v[i]を使用して、未定義の動作につながります。

あなたのコードは、最初べきpush_backvector<int>:あなたは行列の大きさを知っているので

int m, n; 
cin>>m>>n; 
vector<vector<int> > v(m); 

for(int i=0; i<m; i++) 
{ 
    for(int j=0; j<n; j++) 
    { 
     int a; 
     cin>>a; 
     v[i].push_back(a); 
    } 
} 
+0

それは動作します。私はなぜ私がpush_backベクトルを持っている必要があるのか​​詳細を教えてください。 ?? –

+0

@NafeeurRahmanあなたは 'v'に何かpush_backをしなかったので、それはただ空です。 'v'は2-dベクトルです。 – songyuanyao

+1

@NafeeurRahmanベクトル 'v'が空の場合、任意の' i'に対して 'v [i]'にアクセスすると、未定義の振る舞いである 'v'の要素に対して(もしあれば)割り当てられた記憶域外のメモリにアクセスしようとします。同様に、これは 'int v [10];'があり、 'v [99]'にアクセスしようとした場合と似ています。 – jotik

4

だけサイズを変更V:

for (int i=0; i<m; i++) 
{ 
    v.push_back(vector<int>()); 
    for (int j=0; j<n; j++) 
    { 
     int a; 
     cin >> a; 
     v[i].push_back(a); 
    } 
} 

代替は、明示的にサイズmにベクトルvを初期化するだろうあなたがそれを記入する前に:

vector<vector<int> > v(m); 
for(int i=0; i<m; i++) 
{ 
    v[i].resize(n); 
    for(int j=0; j<n; j++) 
    { 
     cin >> v[i][j]; 
    } 
} 
-1
あなたはVを呼び出すときに[i]が構築されていない

V [i]を.push_back()、あなただけのV first.itのシンプルを初期化する必要があります。

vector<vector<int>> v; 
v.reserve(m); 
for(...) 
... 
+0

いいえ、 '予約'は問題を解決しません、 'v'はまだ空です... – songyuanyao

関連する問題