STL系列_istream_iterator和ostream_iterator

ostream_iterator

用法

用 operator<< 写入 T 类型对象到为之创建迭代器的 std::basic_ostream 对象。每次写操作后写入可选的分隔字符串

	std::ostream_iterator<int> out_it(std::cout,",");
	std::copy(v1.begine(),v2.end(),out_it);

源码

class ostream_iterator
    : public iterator<output_iterator_tag, void, void, void, void>
{
      private:
		ostream_type*	_M_stream;
		const _CharT*	_M_string;
        ostream_iterator& operator=(const _Tp& __value)
        {
            // T 类型对象到为之创建迭代器的 std::basic_ostream 对象
            *_M_stream << __value;   
            // 每次写操作后写入可选的分隔字符串
            if (_M_string)
                  *_M_stream << _M_string;
            return *this;
        }
}

istream_iterator

用法

std::istream_iterator 是单趟输入迭代器,从为之创建迭代器的 std::basic_istream 对象读取 T 类型的相继对象,通过调用适当的 operator>> 。实际读取操作在自增,而非解引用迭代器时进行。在构造迭代器时读取首个对象。解引用只返回最近读取的对象的副本。

std::istream_iterator<double> eos;
std::istream_iterator<double> iit(std::cin);
if(iit!=eos) value1 = *iit;
++iit;
if(iit!=eos) value2 = *iit;

源码

class istream_iterator
: public iterator<input_iterator_tag, _Tp, _Dist, const _Tp*, const _Tp&>
{
      istream_type*	_M_stream;
      _Tp		_M_value;
      // 标记流读取结束
      bool		_M_ok;
      // 构造时读取一个值
      istream_iterator(istream_type& __s)
          : _M_stream(std::__addressof(__s)), _M_ok(true)
      { _M_read(); }
      // 自增时读取数据
	  istream_iterator&  operator++() {
			_M_read();
			return *this;
	  }
	  void _M_read()
      {
        if (_M_stream && !(*_M_stream >> _M_value))
          {
            _M_stream = 0;
            _M_ok = false;
          }
      }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值