2016-03-09 6 views
1

Я хочу, чтобы создать матрицу, используя «вектор»:Создание матрицы с использованием STL вектора

vector < vector <int> > Mat; 

Проблема, когда я запускаю этот код:

int i ,j; 
    for(i = 1 ; i <= 5 ; ++i) 
    for(j = 1 ; j <= 5 ; ++j) 
     Mat[i][j] = 0; 

я хотел бы получить довольно неприятный ошибка. Как я могу это исправить?

Я не хочу, чтобы прочитать матрицу так:

for(i = 1 ; i <= 5 ; ++i) 
    for(j = 1 ; j <= 5 ; ++j) 
     M[i].push_back(0); 

ответ

5

Когда вы создаете свои векторы таким образом, они имеют размерность 0. Вы должны инициализировать их с хорошим размером:

vector < vector <int> > Mat(6, std::vector<int>(6)); 

Кстати, добавляя 0 во второй инициализации вектора будет убедиться, что он будет заполнен 0:

vector < vector <int> > Mat(6, std::vector<int>(6, 0)); 
2

Когда вы создаете вектор, он начинает пустым, если вы не скажете ему, какой размер должен быть. Если вектор пуст, вы не можете использовать [], так как он не проводит проверку диапазона и не будет расти. Это оставляет вас с двумя вариантами, используйте push_back() или укажите размер вектора при его создании. Например, мы могли бы использовать

const int matrix_size = 5; 
auto mat = std::vector<std::vector<int>>(matrix_size, std::vector<int>(matrix_size)); 
//          ^# of rows^     ^# of cols^ 

Также помните, что индексы основаны на 0 на C++. Это означает, что для вектора с 5 элементами действительными индексами являются [0, 4]. Вместо того, чтобы возиться с индексами вектора можно использовать ranged based for loop для заполнения вектора как

for(auto& row : mat) 
    for(auto& col : row) 
     std::cin >> col; 

Это заполнит каждый элемент вектора из cin.

+0

Спасибо за ответ, теперь я понимаю. – ivanciprian

+0

@epanicafrate Нет проблем – NathanOliver

0
vector < vector <int> > Mat; 

Это создает пустой Мат;

vector < vector <int> > Mat (5); 

будет создавать его с помощью 5-дюймовых векторов. Проблема все еще не решена, вам также нужно изменить размеры внутренних векторов.

вы можете это сделать: (есть много других более эффективных способов)

for(int i =0;i<5;i++) 
{ 
    Mat[i].resize(5); // resizing the interior matrices 
}