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 :=v의 크기
-
동안 (rowPointer
=v[rowPointer]의 크기) - -
(rowPointer를 1씩 증가)
-
-
함수 정의 next()
-
x :=v[rowPointer, colPointer]
-
(colPointer를 1만큼 증가)
-
colPointer가 v[rowPointer]의 크기와 같으면 -
-
colPointer :=0
-
(rowPointer를 1씩 증가)
-
동안 (rowPointer
=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