15

If it is passed, is it passed by value or by reference?

void printMatrix(vector<vector<int>> *matrix);

...

vector<vector<int>> matrix(3, vector<int>(3,0));
printMatrix(&matrix1);
Piper
  • 1,266
  • 3
  • 15
  • 26
bsoundra
  • 930
  • 2
  • 13
  • 27

3 Answers3

32

Since your function declaration:

void printMatrix(vector< vector<int> > *matrix)

specifies a pointer, it is essentially passed by reference. However, in C++, it's better to avoid pointers and pass a reference directly:

void printMatrix(vector< vector<int> > &matrix)

and

printMatrix(matrix1); // Function call

This looks like a normal function call, but it is passed by reference as indicated in the function declaration. This saves you from unnecessary pointer dereferences.

casablanca
  • 69,683
  • 7
  • 133
  • 150
3

Why not passing just the 2d vector?

void printMatrix(vector < vector<int> > matrix)
{
    cout << "[";
    for(int i=0; i<matrix.size(); i++)
    {
        cout << "[" << matrix[i][0];
        for(int j=0; j<matrix[0].size(); j++)
        {
            cout  << ", " << matrix[i][j];
        }
        cout << "]" << endl;
    }
    cout << "]" << endl;
}

vector < vector<int> > twoDvector;
vector<int> row(3,2);

for(int i=0; i<5; i++)
{
    twoDvector.push_back(row);
}

printMatrix(twoDvector);
Pablo Ruiz Ruiz
  • 605
  • 1
  • 6
  • 23
1

Well, first of all, you're creating it wrong.

vector<vector<int>> matrix1(3, vector<int>(3,0));

You can pass by value or by reference, or by pointer(not recommended). If you're passing to a function that doesn't change the contents, you can either pass by value, or by const reference. I would prefer const reference, some people think the "correct" way is to pass by value.

void printMatrix(const vector<vector<int>> & matrix);

// or
void printMatrix(vector<vector<int>> matrix);

// to call
printMatrix(matrix1);
Benjamin Lindley
  • 101,917
  • 9
  • 204
  • 274
  • 3
    Don't forget a space in the nested template, i.e. `vector >`, otherwise some compilers will complain about invalid right shifts. – casablanca Oct 30 '10 at 23:51
  • I'll just use your comment as a note to that effect. But are there any relevant compilers where this is still an issue? – Benjamin Lindley Oct 30 '10 at 23:55