Just take care of corner cases..
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Vector2D { vector<vector<int>> &r; int i, i0; public: Vector2D(vector<vector<int>>& vec2d) : r(vec2d), i(0), i0(0) { if(r.size() > 0) while (r[i].size() == 0) i++; } int next() { int ret = r[i][i0]; // move on if (i0 < r[i].size() - 1) i0++; else if (i < r.size() - 1) { while (r[++i].size() == 0); i0 = 0; } else // i == r.size() - 1 { i0++; } return ret; } bool hasNext() { if(r.size() == 0) return false; if (i < r.size() - 1) return true; return i0 < r.back().size(); } };