Initializing a two dimensional std::vector

C++Vector

C++ Problem Overview


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?

C++ Solutions


Solution 1 - C++

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 } };
                           

Solution 2 - C++

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;
}

Solution 3 - C++

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));

Solution 4 - C++

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....!

Solution 5 - C++

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.

Solution 6 - C++

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.

Solution 7 - C++

Here is what worked for me:

vector<vector<int>> minA{ROW_SIZE, vector<int>(COLUMN_SIZE, VALUE)};

Solution 8 - C++

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

Solution 9 - C++

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;
        }
}

Solution 10 - C++

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));

Solution 11 - C++

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");
}

Solution 12 - C++

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;
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFerenc DeakView Question on Stackoverflow
Solution 1 - C++hmjdView Answer on Stackoverflow
Solution 2 - C++JasonView Answer on Stackoverflow
Solution 3 - C++juanchopanzaView Answer on Stackoverflow
Solution 4 - C++sarthakgupta072View Answer on Stackoverflow
Solution 5 - C++Muhirwa Gabo OresteView Answer on Stackoverflow
Solution 6 - C++SmitView Answer on Stackoverflow
Solution 7 - C++abhinav1602View Answer on Stackoverflow
Solution 8 - C++user11912163View Answer on Stackoverflow
Solution 9 - C++ashchkView Answer on Stackoverflow
Solution 10 - C++Ayan BhuniaView Answer on Stackoverflow
Solution 11 - C++Sam SmithView Answer on Stackoverflow
Solution 12 - C++Ritik KambojView Answer on Stackoverflow