LintCode 601: Flatten 2D Vector (iterator经典题)

陌路散爱 提交于 2019-12-19 00:57:13
  1. Flatten 2D Vector

Implement an iterator to flatten a 2d vector.

Example
Example 1:

Input:[[1,2],[3],[4,5,6]]
Output:[1,2,3,4,5,6]
Example 2:

Input:[[7,9],[5]]
Output:[7,9,5]

注意这题不能用一个2D vector的copy,不然空间不满足要求。
解法1:利用C++的iterator
这题学到了很多iterator的知识。

  1. 一维和二维vector都有iterator,一维vector的iterator就好比指向每个元素的指针,二维vector的iterator就好比指向其中每个一维vector的指针。
  2. 空的一维和二维vector的begin()和end()相等。
  3. *(iter++)先返回*iter,然后iter++。
    跟*(i++)一回事。
  4. iter像指针,但不能与指针比较。一个未初始化的iter不能与NULL比较。如果非要初始化,可将其初始化为对应container的end()。
    即vector a = {1,2,3,4,5};
    vector::iterator iter = a.end();

代码如下:

class Vector2D {
public:
    Vector2D(vector<vector<int>>& vec2d) {
        begin = vec2d.begin();
        end = vec2d.end();
        if (begin != end) iter = (*begin).begin();
    }

    int next() {
        hasNext();
        return *(iter++);
    }

    bool hasNext() {
        while(begin != end && (iter == (*begin).end())) {
            begin++;
            iter = (*begin).begin();
        }
        return begin != end;
    }

private:
    vector<vector<int>>::iterator begin, end;
    vector<int>::iterator iter;
};

/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i(vec2d);
 * while (i.hasNext()) cout << i.next();
 */
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!