Dado un Vector de Vectores (vector 2D) , la tarea es aplanar este vector 2d.
Ejemplos:
Entrada: vector = [[1, 2, 3, 4], [5, 6], [7, 8]]
Salida: 1 2 3 4 5 6 7 8Entrada: vector = [[1, 2], [3], [4, 5, 6, 8]]
Salida: 1 2 3 4 5 6 8
Algoritmo:
- El vector 2D se puede aplanar usando iteradores .
- Almacene el iterador inicial y final de cada vector en dos arrays, iStart y iEnd respectivamente.
- Cree un método hasNext() para verificar si el vector tiene el siguiente elemento o no.
- Imprime el elemento actual, si hasNext() da como resultado verdadero
A continuación se muestra la implementación del enfoque anterior:
// 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; }
Producción:
1 2 3 4 5 6 7 8 9 10
Publicación traducida automáticamente
Artículo escrito por Aashish Chauhan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA