当前位置:C++技术网 > 资讯 > stream iterators源代码详解

stream iterators源代码详解

更新时间:2015-11-12 22:56:37浏览次数:1+次

所谓stream iterators,可以将迭代器绑定到一个stream(数据流)对象身上。绑定istream对象(例如:std:cin),称为istream_iterator,拥有输入能力。乍听之下真神奇。所谓绑定一个istream object,其实就是在istream iterator内部维护一个istream member,客户端对于这个迭代器所做的operator++操作会导致调用迭代器内部所含的那个istream member的输入操作(operator>>)。这个迭代器是个input iterator,不具备operator--。下面的源代码说明了一切:

template <class T,class Distance =ptrdiff_t>
class istream_iterator{
	friend bool;
	operator==_STL_NULL_TMPL_ARGS (const istream_iterator<T,Distance>& x,
							 const istream_iterator<T, Distance>& Y);
	protected:
		istream* stream;
		T value;
		bool end_marker;
		void read(){
			end_marker=(*stream)? true : false;
			if(end_marker)
				*stream >> value;
			///以上,输入之后,stream的状态可能改变,
                       ///// 所以下面再判断一次以决定 end_marker
			////当读到eof或读到型别不同的资料,stream即处于false状态
			end_marker=(*stream) ? true : false;
		}
	public:
		typedef input_iterator_tag		iterator_category;
		typedef T						value_type;
		typedef Distance				difference_type;
		typedef const T*				pointer;
		typedef const T&				reference;

		istream_iterator() : stream(&cin), end_marker(flase) {}
		istream_iterator(istream& s) : stream(&s) {read();}
		////以上两行的代码的用法:
		/////istream_iterator<int> eos;   造成end_marker 为 false;
		/////istream_iterator<int> initer(cin);   引发read(),程序至此会等待输入
		reference operator*() const {return value; }
		pointer operator->() const {return &operator*(); }
		////迭代器每前进一个位置,就代表独取一笔资料
		istream_iterator<T,Distance>& operator++(){
			read();
			return *this();
		}
		istream_ierator<T,Distance> operator++(int){
			istream_iterator<T,Distance> tmp=*this;
			read();
			return tmp;
		}
};