How to flatten a 2-Dimensional vector in C++
Hello Guys, In this tutorial we are going to learn how to flatten a 2-Dimensional vector in C++. Before we get into this let’s discuss what is a 2-D vector, so it is a vector of vectors. Let’s say we have v as a 2-D then it can be defined as
vector<vector<int> >v;
For example,
v= {{2,3,4};{1,5,3};{6,7};{};{1}};Few things are to be noted here,
- Vectors in ‘v’ can have different sizes.
- The size of a vector can be zero.
Algorithm for flattening a 2-D vector in C++
There is a standard approach to flatten a 2-D vector is using iterators (two-pointers) but with this, I will discuss one more way to do this.
Let’s see the standard one first;
- First, I would recommend you to read this post on Classes and objects, because we will be using this in the implementation of this algorithm.
- We define two pointers one for rows and another for columns.
- Then we set them to the first element of the first vector and update them iteratively.
- And finally terminate the program after printing all elements.
Code
#include<bits/stdc++.h>
using namespace std;
class Flatten2DVector{
public:
// a temporary copy of given vector, will use this furthur to avoid corruptions in original data
vector<vector<int>> temp;
int row, col;//two pointers
Flatten2DVector(vector<vector<int>>& v) {
temp = v;
row = 0;// initialising pointers to first index
col = 0;
}
// returns the elements from temp vector
int next() {
forward();
return temp[row][col++];
}
// checks whether next element is possible or not
// also takes care of skipping the vectors of zero size
bool hasNext() {
forward();
return (row < temp.size());
}
// helps to move forward in the vector
void forward() {
while ((row < temp.size()) && (col>=temp[row].size())) {
row++;
col = 0;
}
}
};
int main(){
vector<vector<int>>v;
v={{1,3},{2,9,5,5},{},{4,5,6},{8}};//given 2Dvector
Flatten2DVector it(v); // Class which has iterator(it) as his object
// check if next element is posible or not, if possible print it
while (it.hasNext()) {
cout << it.next() << " ";
}
cout<<endl;
return 0;
}Now let’s discuss another approach;
This is a very simple approach where I will take all elements of the original 2D vector into a new 1D vector using nested for loops. And then print the new vector.
Code
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<vector<int>>v;
vector<int>n;//new 1D vector
v={{1,3},{2,9,5,5},{},{4,5,6},{8}};//given 2Dvector
// using nested for loops to construct a new 1D vector
for(int i=0; i<v.size(); i++){
for(int j=0; j<v[i].size(); j++){
n.push_back(v[i][j]);
}
}
// Printing New vector
for(int i=0; i<n.size(); i++){
cout<<n[i]<<" ";
}
cout<<endl;
return 0;
}Now, look at the output for both implementations.
Output
1 3 2 9 5 5 4 5 6 8
This is it for this tutorial.
I hope it will help you.
You can also check out these tutorials related to vectors.
Thank you.
Leave a Reply