2016-04-22 109 views
0

我想通過2D矢量從用戶獲取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); 
    } 
} 

根據我的代碼將是什麼解決方案。

回答

5

for循環內調用v[i].push_back(a);時,矢量v爲空,並且使用v[i]將導致未定義的行爲。

你的代碼應該首先push_back一個vector<int>

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

另一種方法是初始化向量v明確大小m

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因爲你沒有將任何東西push_v到'v',它只是空的。 'v'是一個2-d向量。 – songyuanyao

+1

@NafeeurRahman如果向量'v'爲空,則任何'i'訪問'v [i]'都會嘗試訪問分配存儲空間(如果有的話)'v'的元素,這是未定義的行爲。對於類比,這與你有'int v [10];'並且你嘗試訪問'v [99]'的情況類似。 – jotik

4

既然你知道你的矩陣的大小隻是調整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

不,'reserve'不會解決問題,'v'仍然是空的... – songyuanyao