How to flatten a Vector of Vectors or 2D Vector in C++
Given a Vector of Vectors (2D vector), the task is to flatten this 2d vector. Examples:
Input: vector = [[1, 2, 3, 4], [5, 6], [7, 8]] Output: 1 2 3 4 5 6 7 8 Input: vector = [[1, 2], [3], [4, 5, 6, 8]] Output: 1 2 3 4 5 6 8
Algorithm:
- 2D Vector can be flattened using iterators.
- Store starting and ending iterator of every vector in two arrays, iStart & iEnd respectively.
- Create a hasNext() method to check if it has the vector has next element or not.
- Print the current element, if hasNext() yields true
Below is the implementation of the above approach:
CPP
// C++ program to flatten a // Vector of Vectors or 2D Vector #include <bits/stdc++.h> using namespace std; // Class to flatten the 2d vector class FlattenVector { public : int n; vector<vector< int >::iterator> iStart; vector<vector< int >::iterator> iEnd; int currIndex; // Store ending and starting iterators. FlattenVector(vector<vector< int > >& v) { // Get the number // of rows in 2d vector n = v.size(); currIndex = 0; iStart.resize(n); iEnd.resize(n); for ( int i = 0; i < n; i++) { iStart[i] = v[i].begin(); iEnd[i] = v[i].end(); } } // Returns true if any element is left. bool hasNext() { for ( int i = 0; i < n; i++) { if (iStart[i] != iEnd[i]) return true ; } return false ; } int next() { // Vector at currIndex is printed, // increment currIndex. if (iStart[currIndex] == iEnd[currIndex]) { currIndex++; return next(); } // Increment iterator // and return the value. else return *iStart[currIndex]++; } }; // Driver code int main() { vector<vector< int > > v{ { 1, 2 }, { 3 }, { 4, 5, 6 }, { 7, 8, 9, 10 } }; FlattenVector iter(v); while (iter.hasNext()) cout << iter.next() << " " ; return 0; } |
Output:
1 2 3 4 5 6 7 8 9 10
Time Complexity: O(N)
Auxiliary Space: O(N)
Please Login to comment...