输入/输出流迭代器源码阅读

1、输出流迭代器

int main(int argc, char **argv)
{
    vector<int> number = {1, 4, 7, 9, 5, 3};
    ostream_iterator<int> osi(cout, "\n");
    copy(number.begin(), number.end(), osi);//number -》 cout
    return 0;
}

class ostream_iterator {
public:
  ostream_iterator(ostream_type& __s, const _CharT* __c) 
    : _M_stream(&__s), _M_string(__c)  {}
  ostream_iterator<_Tp>& operator=(const _Tp& __value) { 
    *_M_stream << __value;
    if (_M_string) *_M_stream << _M_string;
    return *this;
  }
  ostream_iterator<_Tp>& operator*() { return *this; }
  ostream_iterator<_Tp>& operator++() { return *this; } 
  ostream_iterator<_Tp>& operator++(int) { return *this; } 
private:
  ostream_type* _M_stream;
  const _CharT* _M_string;
};

创建osi对象,调用ostream_iterator的拷贝构造函数:

_M_stream=&cout;   _M_string=&"\n"
 

template <class _InputIter, class _OutputIter>

//__first=number.begin(),__last=number.end(),__result=osi
inline _OutputIter copy(_InputIter __first, _InputIter __last,  
                        _OutputIter __result)
{
  return __copy(__first, __last, __result,
                __ITERATOR_CATEGORY(__first),
                __DISTANCE_TYPE(__first));
}

template <class _InputIter, class _OutputIter, class _Distance>
inline _OutputIter __copy(_InputIter __first, _InputIter __last,
                          _OutputIter __result,
                          input_iterator_tag, _Distance*)
{
  for ( ; __first != __last; ++__result, ++__first)//++__result返回osi
   //*__result返回osi
  //osi=*__first:osi. *_M_stream<<*__first(cout<<*__first)
    *__result = *__first;
  return __result;
}

 

2、输入流迭代器

void test()
{
    vector<int> number;
    istream_iterator<int> isi(cin);
    //错: copy(isi, istream_iterator<int>(), number.end());
    //back_inserter()是迭代器适配器
    copy(isi, istream_iterator<int>(), back_inserter(number));  //cin -》number 
    copy(number.begin(), number.end(), ostream_iterator<int>(cout, " ")); //number -》cout 
}

 class istream_iterator {
public:
  istream_iterator(istream_type& __s) : _M_stream(&__s) { _M_read(); } //_M_stream=&cin
  reference operator*() const { return _M_value; }
 
  reference operator*() const { return _M_value; }  //返回从cin接收的值
  
  istream_iterator& operator++() { 
    _M_read(); 
    return *this;
  }
  istream_iterator operator++(int)  {
    istream_iterator __tmp = *this;
    _M_read();
    return __tmp;
  }
private:
  istream_type* _M_stream;
  _Tp _M_value;
  bool _M_ok;
 
  void _M_read() {
    _M_ok = (_M_stream && *_M_stream) ? true : false;
    if (_M_ok) {
      *_M_stream >> _M_value;     //cin>>isi._M_value
      _M_ok = *_M_stream ? true : false;     
    }
  }
};

 

-----------------------------------------------------------
template <class _Container>
inline back_insert_iterator<_Container> back_inserter(_Container& __x) {   //_x=number
  return back_insert_iterator<_Container>(__x);//创建对象,调用back_insert_iterator类的构造函数
}

template <class _Container>
class back_insert_iterator {
protected:
  _Container* container;
public:
  explicit back_insert_iterator(_Container& __x) : container(&__x) {}//container=&number
  back_insert_iterator<_Container>&
  operator=(const typename _Container::value_type& __value) { 
    container->push_back(__value);//number.push(__value)
    return *this;
  }
  back_insert_iterator<_Container>& operator*() { return *this; }
  back_insert_iterator<_Container>& operator++() { return *this; }
  back_insert_iterator<_Container>& operator++(int) { return *this; }
};

 

----------------------------------------------------------------------------------------
//__first=isi,__last=iterator<int>(),__result=back_inserter(number)返回back_insert_iterator对象
inline _OutputIter __copy(_InputIter __first, _InputIter __last,
                          _OutputIter __result,
                          input_iterator_tag, _Distance*)
{
  for ( ; __first != __last; ++__result, ++__first) //++first会执行isi._M_read():cin>>isi._M_value
    *__result = *__first;  // number.push(isi._M_value)
  return __result;
}

 迭代器适配器

back_inserter函数模板,返回类型是back_insert_iterator

back_insert_iterator是类模板,底层调用了push_back函数

front_inserter函数模板,返回类型是front_insert_iterator

front_insert_iterator是类模板,底层调用了push_front函数

inserter函数模板,返回类型是insert_iterator

insert_iterator是类模板,底层调用了insert函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值