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函数