本文主要是介绍284顶端迭代器(类的设计),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、题目描述
给定一个迭代器类的接口,接口包含两个方法: next() 和 hasNext()。设计并实现一个支持 peek() 操作的顶端迭代器 -- 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。
进阶:你将如何拓展你的设计?使之变得通用化,从而适应所有的类型,而不只是整数型?
2、示例
假设迭代器被初始化为列表 [1,2,3]。
调用 next() 返回 1,得到列表中的第一个元素。
现在调用 peek() 返回 2,下一个元素。在此之后调用 next() 仍然返回 2。
最后一次调用 next() 返回 3,末尾元素。在此之后调用 hasNext() 应该返回 false。
3、题解
next()可以返回队头元素,但会造成队头索引的移动
考的其实是:如何返回队头元素,但队头索引不动
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class Iterator {
public:struct Data{vector<int> nums;int index;};Data* data=new Data();Iterator(const vector<int>& nums){data->index=-1;for(auto num:nums)data->nums.push_back(num);}Iterator(const Iterator& iter){this->data=iter.data;}// Returns the next element in the iteration.int next(){data->index++;return data->nums[data->index];}// Returns true if the iteration has more elements.bool hasNext() const{return data->index<static_cast<int>(data->nums.size());}
};
class PeekingIterator : public Iterator {
public:PeekingIterator(const vector<int>& nums) : Iterator(nums) {//next()可以返回队头元素,但会造成队头索引的移动//考的其实是:如何返回队头元素,但队头索引不动// Initialize any member here.// **DO NOT** save a copy of nums and manipulate it directly.// You should only use the Iterator interface methods.if (Iterator::hasNext())cur = Iterator::next();elsecur = -1;}// Returns the next element in the iteration without advancing the iterator.int peek() {return cur;}// hasNext() and next() should behave the same as in the Iterator interface.// Override them if needed.int next() {int res = cur;if (Iterator::hasNext())cur = Iterator::next();elsecur = -1;return res;}bool hasNext() const {return cur != -1;}
private:int cur;
};
int main()
{const vector<int> nums{1,2,3};PeekingIterator peekIter(nums);cout<<peekIter.next()<<endl;cout<<peekIter.peek()<<endl;cout<<peekIter.next()<<endl;cout<<peekIter.next()<<endl;cout<<peekIter.hasNext()<<endl;return 0;
}
这篇关于284顶端迭代器(类的设计)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!