我们有了一个只支持next
和hasNext
方法的迭代器类,让我们实现一个子类,要求增添一个peek
方法。
我们想实现的peek
是只返回当前元素而不考虑指针后移。但每次调用基类的next
时,返回当前元素后都会后移指针。那么我们可以考虑用一个变量value
在调用基类的next
时缓存当前元素,这样的话即使指针后移了,我们调用peek
时也能直接返回value。为此我们需要一个bool变量flag
来指示value
是否存放了在之后调用peek
和next
应该返回的值。
还有一个比较tricky的方法:peek
时创建一个当前指针对应的副本,由于是局部变量,所以调用结束后会被销毁,所以并没有任何内存问题。
class PeekingIterator : public Iterator {
private:
bool flag;
int value;
public:
PeekingIterator(const vector<int>& nums) : Iterator(nums) {
flag = false; // value是否存放了peek和next应该返回的值
}
int peek(){
if(!flag) value = Iterator::next();
flag = true;
return value;
}
int next() {
if(!flag) return Iterator::next();
flag = false;
return value;
}
bool hasNext() const {
return flag || Iterator::hasNext();
}
};
class PeekingIterator : public Iterator {
public:
PeekingIterator(const vector<int>& nums) : Iterator(nums) {}
int peek(){
// 调用Iterator(const Iterator& iter)创造一个副本
return Iterator(*this).next();
}
// int next() {}
// bool hasNext() const {}
};