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