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