首页 > 其他 > 详细

stream iterators源代码详解

时间:2015-11-14 00:50:31      阅读:389      评论:0      收藏:0      [点我收藏+]


    所谓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;
        }
};

本原创文章来源:C++技术网 http://www.cjjjs.cn ,阅读更多原创精品文章,欢迎访问C++技术网。

stream iterators源代码详解

原文:http://www.cnblogs.com/cjjjs/p/4963516.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!