Multidimensional Vectors

Jun 26, 2015 at 12:17am
I was wondering how one would go about initializing a 2D vector.

With a regular vector, one would typically just initialize the vector in the following manner.

1
2
3
4
5
6
7

std::vector<int> numbers;

numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);


The way I tried initialing a 2D vector was through the following:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

#include <iostream>
#include <vector>

using std::vector;

int main()
{
	vector<vector<int>> Numbers(3, vector<int>(4));
	vector<int> Elements;

	Elements.push_back(4);
	Elements.push_back(3);
	Elements.push_back(2);
	Elements.push_back(1);

	
	Elements.push_back(5);
	Elements.push_back(6);
	Elements.push_back(7);
	Elements.push_back(8);

	
	Elements.push_back(9);
	Elements.push_back(10);
	Elements.push_back(11);
	Elements.push_back(12);

	Numbers.push_back(Elements);

	for(int i = 0; i < 3; i++)
	{
		for(int j = 0; j < 4; j++)
		{
			std::cout << Numbers[i][j] << std::endl; 
			
		}
	
	}


	system("Pause");
	return 0;
}


The problem is,the output is all zeroes.

How does one initialize 2D vectors?
Jun 26, 2015 at 12:45am
The problem you're having is you are setting the size and then adding to it.

If you now what is going to be in the vector of vectors before hand than here is one way.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>

using namespace std;

int main() {
	vector<vector<int>> v = {{1,2,3}, {4,5,6}, {7,8,9}};
	
	for(const auto& i : v)
	{
		for(const auto j : i)
		{
			cout << j << ' ';
		}
		cout << endl;
	}
}


Or in your code just dont set the size before hand.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <vector>

using std::vector;

int main()
{
	vector<vector<int>> Numbers;
	vector<int> Elements;

	Elements.push_back(4);
	Elements.push_back(3);
	Elements.push_back(2);
	Elements.push_back(1);

	
	Elements.push_back(5);
	Elements.push_back(6);
	Elements.push_back(7);
	Elements.push_back(8);

	
	Elements.push_back(9);
	Elements.push_back(10);
	Elements.push_back(11);
	Elements.push_back(12);

	Numbers.push_back(Elements);

	for(int i = 0; i < 3; i++)
	{
		for(int j = 0; j < 4; j++)
		{
			std::cout << Numbers[i][j] << std::endl; 
			
		}
	
	}
}
Jun 26, 2015 at 2:02am
Question:

I get an error informing me my vector subscript is out of range, with the following code

1
2
3
4
5
6
7
8
9
10
11

	for(int i = 0; i < 3; i++)
	{
		for(int j = 0; j < 4; j++)
		{
			std::cout << Numbers[i][j] << std::endl; 
			
		}
	
	}


but i used the following the following and it runs fine.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

	const int row = Numbers.size();
	const int col = Numbers[0].size();

	for(int i = 0; i < row; i++)
	{
		for(int j = 0; j < col; j++)
		{
			std::cout << Numbers[i][j] << std::endl; 
			
		}
	
	}


The value assigned at row is one. Shouldn't it be 3?
Why is Numbers[0].size() 12?

Is this all based on how a multidimensional vector is structured internally?


I keeping getting an error with
vector<vector<int>> v = {{1,2,3}, {4,5,6}, {7,8,9}};
Is this not allowed in C++
Last edited on Jun 26, 2015 at 2:05am
Jun 26, 2015 at 3:24am
> I keeping getting an error with
> vector<vector<int>> v = {{1,2,3}, {4,5,6}, {7,8,9}};
> Is this not allowed in C++

It was not allowed in legacy C++ (C++ as it existed before 2011).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <vector>

void fn_cplus_plus_curent()
{
    // http://www.stroustrup.com/C++11FAQ.html#init-list
    std::vector< std::vector<int> > vec { {1,2,3}, {4,5,6}, {7,8,9} };

    for( const auto& row : vec ) // http://www.stroustrup.com/C++11FAQ.html#for
    {
        for( int v : row ) std::cout << v << ' ' ;
        std::cout << '\n' ;
    }
    std::cout << '\n' ;
}

void fn_cplus_plus_old()
{
    std::vector< std::vector<int> > vec( 3, std::vector<int>(3) ) ; // 3x3, all zeroes

    int value = 0 ;
    for( std::size_t r = 0 ; r < vec.size() ; ++r )
        for( std::size_t c = 0 ; c < vec[r].size() ; ++c )
            vec[r][c] = ++value ;

    for( std::size_t r = 0 ; r < vec.size() ; ++r )
    {
        for( std::size_t c = 0 ; c < vec[r].size() ; ++c ) std::cout << vec[r][c] << ' ' ;
        std::cout << '\n' ;
    }
    std::cout << '\n' ;
}

int main()
{
    fn_cplus_plus_curent() ;
    fn_cplus_plus_old() ;
}
Topic archived. No new replies allowed.