Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Flatten 2D Vector - Iterator làm phẳng vector 2D


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