如何在C++中扁平化Vector或2D Vector

2021年3月14日14:44:47 发表评论 888 次浏览

给定一个向量(2D向量), 任务是将2d向量展平。

例子:

输入:向量= [[1、2、3、4], [5、6], [7、8]]输出:1 2 3 4 5 6 7 8输入:向量= [[1、2], [3 ], [4, 5, 6, 8]]输出:1 2 3 4 5 6 8

算法

  1. 2D向量可以使用以下方法展平迭代器.
  2. 将每个向量的开始和结束迭代器分别存储在两个数组iStart和iEnd中。
  3. 创建一个hasNext()方法检查它是否具有向量是否具有下一个元素。
  4. 如果hasNext()产生true, 则打印当前元素

下面是上述方法的实现:

// 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;
}

输出如下:

1 2 3 4 5 6 7 8 9 10

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: