163

So, I have the following:

std::vector< std::vector <int> > fog;

and I am initializing it very naively like:

    for(int i=0; i<A_NUMBER; i++)
    {
            std::vector <int> fogRow;
            for(int j=0; j<OTHER_NUMBER; j++)
            {
                 fogRow.push_back( 0 );
            }
            fog.push_back(fogRow);
    }

And it feels very wrong... Is there another way of initializing a vector like this?

Ferenc Deak
  • 32,654
  • 15
  • 96
  • 158
  • 4
    I would recommend a 1d vector implementation for a 2d vector if you don't require more space than `std::vector::max_size()`. [Here](http://stackoverflow.com/a/13937325/942596) – andre Jul 15 '13 at 20:34
  • It would have been nice if at least one of the answers didn't involve **copying** the inner vector: memset is faster than memcpy (and calloc even better if operator new gets inlined). – Marc Glisse Jan 25 '20 at 07:30

12 Answers12

292

Use the std::vector::vector(count, value) constructor that accepts an initial size and a default value:

std::vector<std::vector<int> > fog(
    ROW_COUNT,
    std::vector<int>(COLUMN_COUNT)); // Defaults to zero initial value

If a value other than zero, say 4 for example, was required to be the default then:

std::vector<std::vector<int> > fog(
    ROW_COUNT,
    std::vector<int>(COLUMN_COUNT, 4));

I should also mention uniform initialization was introduced in C++11, which permits the initialization of vector, and other containers, using {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
                           
NathanOliver
  • 161,918
  • 27
  • 262
  • 366
hmjd
  • 117,013
  • 19
  • 199
  • 247
  • What if I make the storage class of the `std :: vector >` as `static` ? – strikersps Apr 21 '20 at 09:06
  • reference for Error: "Expected parameter declarator": https://stackoverflow.com/a/68247443/2918210 – weiwen Feb 18 '22 at 05:02
  • In this way, it seems that first a template vector is created and then it's copied ROW_COUNT times. So there will be ROW_COUNT + 1 vector created, is it right? – Xiaofeng Zheng Feb 25 '22 at 10:05
109

Let's say you want to initialize 2D vector, m*n, with initial value to be 0

we could do this

#include<iostream>
int main(){ 
    int m = 2, n = 5;

    vector<vector<int>> vec(m, vector<int> (n, 0));

    return 0;
}
Jason
  • 2,488
  • 2
  • 18
  • 32
  • 8
    Just earned a 'Good Answer' because of this answer. Other people already gave the same answer, but those who upvote this one may be similar to me when I came to this post, that we didn't recognize that some other answers are actually the same answer. I think it might be because three reasons: 1) this code could be copied, pasted, and run right away 2) `std::` makes it longer and people might like short and direct answer; 3) the long naming of variable confuses beginners. I'm a beginner too, don't really know how important we need `std::`, need a code runnable so I know what each variable does – Jason Feb 10 '20 at 08:53
37

There is no append method in std::vector, but if you want to make a vector containing A_NUMBER vectors of int, each of those containing other_number zeros, then you can do this:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));
juanchopanza
  • 216,937
  • 30
  • 383
  • 461
9

The general syntax, as depicted already is:

std::vector<std::vector<int> > v (A_NUMBER, std::vector <int> (OTHER_NUMBER, DEFAULT_VALUE))  

Here, the vector 'v' can be visualised as a two dimensional array, with 'A_NUMBER' of rows, with 'OTHER_NUMBER' of columns with their initial value set to 'DEFAULT_VALUE'.

Also it can be written like this:

std::vector <int> line(OTHER_NUMBER, DEFAULT_VALUE)
std::vector<std::vector<int> > v(A_NUMBER, line)

Inputting values in a 2-D vector is similar to inputting values in a 2-D array:

for(int i = 0; i < A_NUMBER; i++) {
     for(int j = 0; j < OTHER_NUMBER; j++) {
         std::cin >> v[i][j]
     }
}

Examples have already been stated in other answers....!

sarthakgupta072
  • 393
  • 5
  • 11
7

I think the easiest way to make it done is :

std::vector<std::vector<int>>v(10,std::vector<int>(11,100));

10 is the size of the outer or global vector, which is the main one, and 11 is the size of inner vector of type int, and initial values are initialized to 100! That's my first help on stack, i think it helps someone.

sticky bit
  • 35,543
  • 12
  • 29
  • 39
6

The recommended approach is to use fill constructor to initialize a two-dimensional vector with a given default value :

std::vector<std::vector<int>> fog(M, std::vector<int>(N, default_value));

where, M and N are dimensions for your 2D vector.

Sridhar Thiagarajan
  • 570
  • 1
  • 7
  • 19
Smit
  • 101
  • 1
  • 2
4

Here is what worked for me:

vector<vector<int>> minA{ROW_SIZE, vector<int>(COLUMN_SIZE, VALUE)};
abhinav1602
  • 1,015
  • 15
  • 17
  • 1
    interesting, I thought we should enclose `ROW_SIZE, vector(COLUMN_SIZE, VALUE)` with parentheses, instead of curly braces (I know that yours works too). – Alireza Amani Jul 26 '21 at 02:11
2

Suppose you want to initialize a two dimensional integer vector with n rows and m column each having value 'VAL'

Write it as

std::vector<vector<int>> arr(n, vector<int>(m,VAL));

This VAL can be a integer type variable or constant such as 100

1

This code snippet copies one two-dimensional vector to another. And gives us a clear picture of how to initialize the 2D vector.

void copyVectorToVector(vector<vector<int>> matrix) {

        int rowNumber = matrix.size();
        int columnNumber = matrix[0].size();
        vector<vector<int>> result(rowNumber, vector<int> (columnNumber, 0));

        for(int i=0;i<matrix.size();i++){
            for(int j=0;j<matrix[i].size();j++){
                result[i][j] = matrix[i][j];
                cout<<result[i][j]<<" ";
            }
            cout<<endl;
        }
}
ashchk
  • 150
  • 13
1

This answer will help to easily initialize 2d vector after declaration.

int n=4,m=3;
int default_value = 0;

std::vector<std::vector<int>> matrix;

matrix.resize(m, std::vector<int>(n, default_value));
Ayan Bhunia
  • 379
  • 1
  • 10
-1

multiplication table with 2D vector the first 10 is for ROW, second 10 for COLUMN

std::vector<std::vector<int>> multiplication (10,std::vector<int>(10));
for(int i{0}; i<multiplication.size(); ++i){
    for(int j{0}; j<multiplication[i].size(); ++j){
        multiplication[i][j] = j * i;
    }
}

for(int i{1}; i < multiplication.size(); ++i){
    for(int j{1}; j < multiplication[i].size(); ++j){
        std::cout<<multiplication[i][j]<<"\t";
    }
    printf("\n");
}
Sam Smith
  • 11
  • 3
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-ask). – Community Sep 11 '21 at 19:11
-3

My c++ STL code to initialise 5*3 2-D vector with zero


#include <iostream>
using namespace std;
#include <vector>
int main()
{// if we wnt to initialise a 2 D vector with 0;

    vector<vector<int>> v1(5, vector<int>(3,0));

    for(int i=0;i<v1.size();i++) 
{
        for(int j=0;j<v1[i].size();j++)

           cout<<v1[i][j]<<" ";

            cout<<endl;
    }
}
Ritik Kamboj
  • 656
  • 4
  • 9