# How do you dynamically allocate a matrix?

### Question

How do you dynamically allocate a 2D matrix in C++? I have tried based on what I already know:

``````#include <iostream>

int main(){
int rows;
int cols;
int * arr;
arr = new int[rows][cols];
}
``````

It works for one parameter, but now for two. What should I do?

1
18
9/10/2009 2:53:20 AM

A matrix is actually an array of arrays.

``````int rows = ..., cols = ...;
int** matrix = new int*[rows];
for (int i = 0; i < rows; ++i)
matrix[i] = new int[cols];
``````

Of course, to delete the matrix, you should do the following:

``````for (int i = 0; i < rows; ++i)
delete [] matrix[i];
delete [] matrix;
``````

I have just figured out another possibility:

``````int rows = ..., cols = ...;
int** matrix = new int*[rows];
if (rows)
{
matrix = new int[rows * cols];
for (int i = 1; i < rows; ++i)
matrix[i] = matrix + i * cols;
}
``````

Freeing this array is easier:

``````if (rows) delete [] matrix;
delete [] matrix;
``````

This solution has the advantage of allocating a single big block of memory for all the elements, instead of several little chunks. The first solution I posted is a better example of the arrays of arrays concept, though.

48
9/10/2009 3:30:43 AM

You can also use `std::vectors` for achieving this:

using `std::vector< std::vector<int> >`

Example:

``````std::vector< std::vector<int> > a;

//m * n is the size of the matrix

int m = 2, n = 4;
//Grow rows by m
a.resize(m);
for(int i = 0 ; i < m ; ++i)
{
//Grow Columns by n
a[i].resize(n);
}
//Now you have matrix m*n with default values

//you can use the Matrix, now
a=1;
a=2;
a=3;
a=4;

//OR
for(i = 0 ; i < m ; ++i)
{
for(int j = 0 ; j < n ; ++j)
{      //modify matrix
int x = a[i][j];
}

}
``````