Cho vector 2D, cài đặt iterator làm phẳng với next() và hasNext().
Ví dụ: [[1,2],[3],[4]] → lần lượt trả 1,2,3,4.
Giải thuật (Hai con trỏ hàng/cột)
Giữ rowPointer, colPointer. next() trả v[row][col], tăng col, nếu hết hàng thì chuyển hàng tiếp theo không rỗng. hasNext() kiểm tra rowPointer < n.
Cài đặt C++
#include <bits/stdc++.h>
using namespace std;
class Vector2D {
public:
int rowPointer = 0, colPointer = 0, n;
vector<vector<int>> v;
Vector2D(vector<vector<int>>& v) : v(v) {
n = v.size();
advanceToValid();
}
void advanceToValid() {
while (rowPointer < n && colPointer >= v[rowPointer].size()) {
rowPointer++;
colPointer = 0;
}
}
int next() {
int x = v[rowPointer][colPointer];
colPointer++;
if (colPointer == v[rowPointer].size()) {
colPointer = 0;
rowPointer++;
advanceToValid();
}
return x;
}
bool hasNext() { return rowPointer != n; }
};
int main() {
vector<vector<int>> v = {{1,2},{3},{4}};
Vector2D ob(v);
cout << ob.next() << endl; // 1
cout << ob.next() << endl; // 2
cout << ob.next() << endl; // 3
cout << ob.hasNext() << endl; // 1
cout << ob.next() << endl; // 4
cout << ob.hasNext(); // 0
return 0;
}
Đầu vào
ob.next() ob.next() ob.next() ob.hasNext() ob.next() ob.hasNext()
Đầu ra
1 2 3 1 4 0