Create Vector of Vectors in C++

This article will explain how to create a vector of vectors in C++.

Use Default Constructor to Create a Vector of Vectors in C++

Since creating a vector of vectors means constructing a two-dimensional matrix, we will define `LENGTH` and `WIDTH` constants to specify as constructor parameters. Notation needed to declare an integer vector of vectors is `vector<vector<int> >` (space after the first `<` is for readability purposes only).

In the following example, we essentially declare a 4x6 dimensional matrix, elements of which can be accessed using `[x][y]` notation and initialized using literal values. Note that we can also access the 2d vector’s elements by calling the `at` method twice with given positions.

``````#include <iostream>
#include <vector>
#include <iomanip>

using std::cout; using std::vector;
using std::endl; using std::setw;

constexpr int LENGTH = 4;
constexpr int WIDTH = 6;

int main()
{
vector<vector<int> > vector_2d(LENGTH, vector<int> (WIDTH, 0));

vector_2d[2][2] = 12;
cout << vector_2d[2][2] << endl;

vector_2d.at(3).at(3) = 99;
cout << vector_2d[3][3] << endl;

return EXIT_SUCCESS;
}
``````

Output:

``````12
99
``````

Use the `rand` Function to Fill Vector of Vectors With Arbitrary Values in C++

A vector of vectors is often used in multiple linear algebra or graphics workflows. Thus, it’s common to have a two-dimensional vector initialized with random values. Initializing relatively larger 2D vectors using the initializer list can be cumbersome, so one should utilize loop iteration and the `rand` function to generate arbitrary values.

Since this case does not entail any cryptographically sensitive operation, the `rand` function seeded with the current time argument will generate sufficiently random values. We are generating a random number in the interval of `[0, 100)` and at the same time outputting each element to the console.

``````#include <iostream>
#include <vector>
#include <iomanip>

using std::cout; using std::vector;
using std::endl; using std::setw;

constexpr int LENGTH = 4;
constexpr int WIDTH = 6;

int main()
{
vector<vector<int> > vector_2d(LENGTH, vector<int> (WIDTH, 0));

std::srand(std::time(nullptr));
for (auto &item : vector_2d) {
for (auto &i : item) {
i = rand() % 100;
cout << setw(2) << i << "; ";
}
cout << endl;
}
cout << endl;

return EXIT_SUCCESS;
}
``````

Output:

``````83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;
``````

Use the Range Based Loop to Modify Each Element of Vector of Vectors in C++

Generally, declaring two-dimensional matrices using `std::vector` as shown in the previous examples can be quite inefficient and compute-heavy for latency-critical applications. Time-sensitive applications usually declare matrices using old school C-style `[][]` notation. On the plus side, the `std::vector` matrix can be iterated with a range-based loop, as demonstrated in the following example.

``````#include <iostream>
#include <vector>
#include <iomanip>

using std::cout; using std::vector;
using std::endl; using std::setw;

constexpr int LENGTH = 4;
constexpr int WIDTH = 6;

int main()
{
vector<vector<int> > vector_2d(LENGTH, vector<int> (WIDTH, 0));

for (auto &item : vector_2d) {
for (auto &i : item) {
i = rand() % 100;
cout << setw(2) << i << "; ";
}
cout << endl;
}
cout << endl;

// Multiply Each Element By 3
for (auto &item : vector_2d) {
for (auto &i : item) {
i *= 3;
}
}

for (auto &item : vector_2d) {
for (auto &i : item) {
cout << setw(2) << i << "; ";
}
cout << endl;
}

return EXIT_SUCCESS;
}
``````

Output:

``````83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;

249; 258; 231; 45; 279; 105;
258; 276; 147; 63; 186; 81;
270; 177; 189; 78; 120; 78;
216; 108; 33; 204; 201; 87
``````

Related Article - C++ Vector

• Print Out the Contents of a Vector in C++
• Iterate Though a Vector in C++