2016-04-22 2 views
0

Я хочу взять данные от пользователя для 2D-матрицы 2D-вектором. Но пока я делаю, как показано ниже, программа разбилась !!! Но почему?Инициализация 2D-вектора в C++

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

В точке, где v[i].push_back(a); называется внутри цикла for, вектор v пуст и использование v[i] приведет к непредсказуемому поведению.

Ваш код должен первым push_backvector<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 Потому что вы не нажимали ничего на 'v', и он просто пуст. 'v' - 2-й вектор. – songyuanyao

+1

@NafeeurRahman Если вектор 'v' пуст, то доступ к' v [i] 'для любого' i' будет пытаться получить доступ к памяти за пределами выделенного хранилища (если есть) для элементов 'v', что является неопределенным поведением. Для аналогии это похоже на случай, когда у вас есть 'int v [10];' и вы пытаетесь получить доступ к 'v [99]'. – jotik

4

Так как вы знаете размер вашей матрицы просто изменить размер об прежде чем заполнить его:

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 [я] не был построен, когда вы звоните V [я] .push_back(), вам просто нужно инициализировать v first.it просто:

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

Нет, 'reserve' не решит проблему,' v' по-прежнему пуст ... – songyuanyao

Смежные вопросы