C++中二維向量的扁平化


假設我們有一個二維向量,我們需要設計和實現一個迭代器來展平該二維向量。方法如下:

  • next() - 返回當前元素的下一個元素

  • hasNext() - 檢查是否存在下一個元素

所以,如果輸入像[[1,2],[3],[4]],那麼如果我們呼叫函式如下:

  • iterator.next();

  • iterator.next();

  • iterator.next();

  • iterator.hasNext();

  • iterator.hasNext();

  • iterator.next();

  • iterator.hasNext();

那麼輸出將是[1,2,3,true, true,4,false]

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個二維陣列v

  • 定義初始化器,它將接收一個二維陣列v,

  • rowPointer := 0

  • colPointer := 0

  • n := v的大小

  • 當 (rowPointer < n 且 colPointer >= v[rowPointer]的大小) 時,執行:

    • (將rowPointer加1)

  • 定義函式next()

  • x := v[rowPointer, colPointer]

  • (將colPointer加1)

  • 如果colPointer等於v[rowPointer]的大小,則:

    • colPointer := 0

    • (將rowPointer加1)

    • 當 (rowPointer < n 且 colPointer >= v[rowPointer]的大小) 時,執行:

      • (將rowPointer加1)

  • 返回x

  • 定義函式hasNext()

  • 當rowPointer等於n時返回false

示例

讓我們看看下面的實現,以便更好地理解:

線上演示

#include <bits/stdc++.h>
using namespace std;
class Vector2D {
public:
   int rowPointer, colPointer;
   int n;
   vector<vector<int< > v;
   Vector2D(vector<vector<int< >& v){
      this->v = v;
      rowPointer = 0;
      colPointer = 0;
      n = v.size();
      while (rowPointer < n && colPointer >= v[rowPointer].size()){
         rowPointer++;
      }
   }
   int next(){
      //cout << rowPointer << " " << colPointer << endl;
      int x = v[rowPointer][colPointer];
      colPointer++;
      if (colPointer == v[rowPointer].size()) {
         colPointer = 0;
         rowPointer++;
         while (rowPointer < n && colPointer >= v[rowPointer].size()) {
            rowPointer++;
         }
      }
      return x;
   }
   bool hasNext(){
      return !(rowPointer == n);
   }
};
main(){
   vector<vector<int<> v = {{1,2},{3},{4}};
   Vector2D ob(v);
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext());
}

輸入

ob.next()
ob.next()
ob.next()
ob.hasNext()
ob.next()
ob.hasNext()

輸出

1
2
3
1
4
0

更新於:2020年11月18日

519 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.