在 C++ 中展平 2D 向量
假设我们有一个 2D 向量,我们必须设计和实现一个迭代器来展平该 2d 向量。将有不同的方法如下 −
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]
要解决此问题,我们将遵循以下步骤 −
定义一个 2D 数组 v
定义初始化程序,这将需要一个 2D 数组 v,
rowPointer := 0
colPointer := 0
n := size of v
while (rowPointer < n and colPointer >= size of v[rowPointer]), do −
(将 rowPointer 增加 1)
定义一个函数 next()
x := v[rowPointer, colPointer]
(将 colPointer 增加 1)
如果 colPointer 与 v[rowPointer] 的大小相同,则 −
colPointer := 0
(将 rowPointer 增加 1)
当 (rowPointer < n and colPointer >= v[rowPointer] 的大小) 时,执行 −
(将 rowPointer 增加 1)
return 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