⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stl_iterator.h

📁 c++编程宝典源码及Quincy99编译器 是《标准C++编程宝典》电子工业出版社的光盘
💻 H
📖 第 1 页 / 共 2 页
字号:
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class _Container, class _Iterator>inline insert_iterator<_Container> inserter(_Container& __x, _Iterator __i){  typedef typename _Container::iterator __iter;  return insert_iterator<_Container>(__x, __iter(__i));}#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class _BidirectionalIterator, class _Tp, class _Reference = _Tp&,           class _Distance = ptrdiff_t> #elsetemplate <class _BidirectionalIterator, class _Tp, class _Reference,           class _Distance> #endifclass reverse_bidirectional_iterator {  typedef reverse_bidirectional_iterator<_BidirectionalIterator, _Tp,                                          _Reference, _Distance>  _Self;protected:  _BidirectionalIterator current;public:  typedef bidirectional_iterator_tag iterator_category;  typedef _Tp                        value_type;  typedef _Distance                  difference_type;  typedef _Tp*                       pointer;  typedef _Reference                 reference;  reverse_bidirectional_iterator() {}  explicit reverse_bidirectional_iterator(_BidirectionalIterator __x)    : current(__x) {}  _BidirectionalIterator base() const { return current; }  _Reference operator*() const {    _BidirectionalIterator __tmp = current;    return *--__tmp;  }#ifndef __SGI_STL_NO_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */  _Self& operator++() {    --current;    return *this;  }  _Self operator++(int) {    _Self __tmp = *this;    --current;    return __tmp;  }  _Self& operator--() {    ++current;    return *this;  }  _Self operator--(int) {    _Self __tmp = *this;    ++current;    return __tmp;  }};#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class _BidirectionalIterator, class _Tp, class _Reference,           class _Distance>inline bidirectional_iterator_tagiterator_category(const reverse_bidirectional_iterator<_BidirectionalIterator,                                                       _Tp, _Reference,                                                        _Distance>&) {  return bidirectional_iterator_tag();}template <class _BidirectionalIterator, class _Tp, class _Reference,           class _Distance>inline _Tp*value_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp,                                               _Reference, _Distance>&){  return (_Tp*) 0;}template <class _BidirectionalIterator, class _Tp, class _Reference,           class _Distance>inline _Distance*distance_type(const reverse_bidirectional_iterator<_BidirectionalIterator,                                                    _Tp,                                                   _Reference, _Distance>&){  return (_Distance*) 0;}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class _BiIter, class _Tp, class _Ref,          class _Distance>inline bool operator==(    const reverse_bidirectional_iterator<_BiIter, _Tp, _Ref, _Distance>& __x,     const reverse_bidirectional_iterator<_BiIter, _Tp, _Ref, _Distance>& __y){  return __x.base() == __y.base();}#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION// This is the new version of reverse_iterator, as defined in the//  draft C++ standard.  It relies on the iterator_traits template,//  which in turn relies on partial specialization.  The class//  reverse_bidirectional_iterator is no longer part of the draft//  standard, but it is retained for backward compatibility.template <class _Iterator>class reverse_iterator {protected:  _Iterator current;public:  typedef typename iterator_traits<_Iterator>::iterator_category          iterator_category;  typedef typename iterator_traits<_Iterator>::value_type          value_type;  typedef typename iterator_traits<_Iterator>::difference_type          difference_type;  typedef typename iterator_traits<_Iterator>::pointer          pointer;  typedef typename iterator_traits<_Iterator>::reference          reference;  typedef _Iterator iterator_type;  typedef reverse_iterator<_Iterator> _Self;public:  reverse_iterator() {}  explicit reverse_iterator(iterator_type __x) : current(__x) {}  reverse_iterator(const _Self& __x) : current(__x.current) {}#ifdef __STL_MEMBER_TEMPLATES  template <class _Iter>  reverse_iterator(const reverse_iterator<_Iter>& __x)    : current(__x.base()) {}#endif /* __STL_MEMBER_TEMPLATES */      iterator_type base() const { return current; }  reference operator*() const {    _Iterator __tmp = current;    return *--__tmp;  }#ifndef __SGI_STL_NO_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */  _Self& operator++() {    --current;    return *this;  }  _Self operator++(int) {    _Self __tmp = *this;    --current;    return __tmp;  }  _Self& operator--() {    ++current;    return *this;  }  _Self operator--(int) {    _Self __tmp = *this;    ++current;    return __tmp;  }  _Self operator+(difference_type __n) const {    return _Self(current - __n);  }  _Self& operator+=(difference_type __n) {    current -= __n;    return *this;  }  _Self operator-(difference_type __n) const {    return _Self(current + __n);  }  _Self& operator-=(difference_type __n) {    current += __n;    return *this;  }  reference operator[](difference_type __n) const { return *(*this + __n); }  };  template <class _Iterator>inline bool operator==(const reverse_iterator<_Iterator>& __x,                        const reverse_iterator<_Iterator>& __y) {  return __x.base() == __y.base();}template <class _Iterator>inline bool operator<(const reverse_iterator<_Iterator>& __x,                       const reverse_iterator<_Iterator>& __y) {  return __y.base() < __x.base();}template <class _Iterator>inline typename reverse_iterator<_Iterator>::difference_typeoperator-(const reverse_iterator<_Iterator>& __x,           const reverse_iterator<_Iterator>& __y) {  return __y.base() - __x.base();}template <class _Iterator>inline reverse_iterator<_Iterator> operator+(typename reverse_iterator<_Iterator>::difference_type __n,          const reverse_iterator<_Iterator>& __x) {  return reverse_iterator<_Iterator>(__x.base() - __n);}#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */// This is the old version of reverse_iterator, as found in the original//  HP STL.  It does not use partial specialization.#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class _RandomAccessIterator, class _Tp, class _Reference = _Tp&,          class _Distance = ptrdiff_t> #elsetemplate <class _RandomAccessIterator, class _Tp, class _Reference,          class _Distance> #endifclass reverse_iterator {  typedef reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>        _Self;protected:  _RandomAccessIterator current;public:  typedef random_access_iterator_tag iterator_category;  typedef _Tp                        value_type;  typedef _Distance                  difference_type;  typedef _Tp*                       pointer;  typedef _Reference                 reference;  reverse_iterator() {}  explicit reverse_iterator(_RandomAccessIterator __x) : current(__x) {}  _RandomAccessIterator base() const { return current; }  _Reference operator*() const { return *(current - 1); }#ifndef __SGI_STL_NO_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */  _Self& operator++() {    --current;    return *this;  }  _Self operator++(int) {    _Self __tmp = *this;    --current;    return __tmp;  }  _Self& operator--() {    ++current;    return *this;  }  _Self operator--(int) {    _Self __tmp = *this;    ++current;    return __tmp;  }  _Self operator+(_Distance __n) const {    return _Self(current - __n);  }  _Self& operator+=(_Distance __n) {    current -= __n;    return *this;  }  _Self operator-(_Distance __n) const {    return _Self(current + __n);  }  _Self& operator-=(_Distance __n) {    current += __n;    return *this;  }  _Reference operator[](_Distance __n) const { return *(*this + __n); }};template <class _RandomAccessIterator, class _Tp,           class _Reference, class _Distance>inline random_access_iterator_tagiterator_category(const reverse_iterator<_RandomAccessIterator, _Tp,                                         _Reference, _Distance>&){  return random_access_iterator_tag();}template <class _RandomAccessIterator, class _Tp,          class _Reference, class _Distance>inline _Tp* value_type(const reverse_iterator<_RandomAccessIterator, _Tp,                                              _Reference, _Distance>&){  return (_Tp*) 0;}template <class _RandomAccessIterator, class _Tp,          class _Reference, class _Distance>inline _Distance* distance_type(const reverse_iterator<_RandomAccessIterator,                                      _Tp, _Reference, _Distance>&){  return (_Distance*) 0;}template <class _RandomAccessIterator, class _Tp,          class _Reference, class _Distance>inline bool operator==(const reverse_iterator<_RandomAccessIterator, _Tp,                                  _Reference, _Distance>& __x,            const reverse_iterator<_RandomAccessIterator, _Tp,                                  _Reference, _Distance>& __y){  return __x.base() == __y.base();}template <class _RandomAccessIterator, class _Tp,          class _Reference, class _Distance>inline bool operator<(const reverse_iterator<_RandomAccessIterator, _Tp,                                 _Reference, _Distance>& __x,           const reverse_iterator<_RandomAccessIterator, _Tp,                                 _Reference, _Distance>& __y){  return __y.base() < __x.base();}template <class _RandomAccessIterator, class _Tp,          class _Reference, class _Distance>inline _Distance operator-(const reverse_iterator<_RandomAccessIterator, _Tp,                                 _Reference, _Distance>& __x,           const reverse_iterator<_RandomAccessIterator, _Tp,                                 _Reference, _Distance>& __y){  return __y.base() - __x.base();}template <class _RandAccIter, class _Tp, class _Ref, class _Dist>inline reverse_iterator<_RandAccIter, _Tp, _Ref, _Dist> operator+(_Dist __n,          const reverse_iterator<_RandAccIter, _Tp, _Ref, _Dist>& __x){  return reverse_iterator<_RandAccIter, _Tp, _Ref, _Dist>(__x.base() - __n);}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */// When we have templatized iostreams, istream_iterator and ostream_iterator// must be rewritten.template <class _Tp, class _Dist = ptrdiff_t> class istream_iterator {  friend bool operator== __STL_NULL_TMPL_ARGS (const istream_iterator&,                                               const istream_iterator&);protected:  istream* _M_stream;  _Tp _M_value;  bool _M_end_marker;  void _M_read() {    _M_end_marker = (*_M_stream) ? true : false;    if (_M_end_marker) *_M_stream >> _M_value;    _M_end_marker = (*_M_stream) ? true : false;  }public:  typedef input_iterator_tag  iterator_category;  typedef _Tp                 value_type;  typedef _Dist               difference_type;  typedef const _Tp*          pointer;  typedef const _Tp&          reference;  istream_iterator() : _M_stream(&cin), _M_end_marker(false) {}  istream_iterator(istream& __s) : _M_stream(&__s) { _M_read(); }  reference operator*() const { return _M_value; }#ifndef __SGI_STL_NO_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */  istream_iterator<_Tp, _Dist>& operator++() {     _M_read();     return *this;  }  istream_iterator<_Tp, _Dist> operator++(int)  {    istream_iterator<_Tp, _Dist> __tmp = *this;    _M_read();    return __tmp;  }};#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class _Tp, class _Dist>inline input_iterator_tag iterator_category(const istream_iterator<_Tp, _Dist>&){  return input_iterator_tag();}template <class _Tp, class _Dist>inline _Tp* value_type(const istream_iterator<_Tp, _Dist>&) { return (_Tp*) 0; }template <class _Tp, class _Dist>inline _Dist* distance_type(const istream_iterator<_Tp, _Dist>&) { return (_Dist*)0; }#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class _Tp, class _Distance>inline bool operator==(const istream_iterator<_Tp, _Distance>& __x,                       const istream_iterator<_Tp, _Distance>& __y) {  return (__x._M_stream == __y._M_stream &&          __x._M_end_marker == __y._M_end_marker) ||         __x._M_end_marker == false && __y._M_end_marker == false;}template <class _Tp>class ostream_iterator {protected:  ostream* _M_stream;  const char* _M_string;public:  typedef output_iterator_tag iterator_category;  typedef void                value_type;  typedef void                difference_type;  typedef void                pointer;  typedef void                reference;  ostream_iterator(ostream& __s) : _M_stream(&__s), _M_string(0) {}  ostream_iterator(ostream& __s, const char* __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; } };#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class _Tp>inline output_iterator_tag iterator_category(const ostream_iterator<_Tp>&) {  return output_iterator_tag();}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */__STL_END_NAMESPACE#endif /* __SGI_STL_INTERNAL_ITERATOR_H */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -